Vue +echart 元件化例項
阿新 • • 發佈:2021-06-11
https://leetcode-cn.com/problems/kth-largest-element-in-an-array/
215. 陣列中的第K個最大元素
在未排序的陣列中找到第k個最大的元素。請注意,你需要找的是陣列排序後的第 k 個最大的元素,而不是第 k 個不同的元素。示例 1:
輸入: [3,2,1,5,6,4] 和
k = 2
輸出: 5
示例2:
輸入: [3,2,3,1,2,4,5,5,6] 和
k = 4
輸出: 4
說明:
你可以假設 k 總是有效的,且 1 ≤ k ≤ 陣列的長度。
問題思路:陣列中的第K個最大元素可以借用快排的思路,通過匹配哨兵位置進行左右查詢,相當於半分治(只遞迴一半,並非整個原問題分解為子問題)。
1.通過快排思路,校正第一個哨兵的位置(左側元素小於哨兵,右側元素大於哨兵),通過比較哨兵的位置,來確定遞迴(分治)方向。
2.將原問題在整個區間找到哨兵的位置分解為在子區間找到對應哨兵的位置。
3.當哨兵的位置恰好為第k大位置時,返回哨兵的值。
程式碼設計思路:
1.因為設計的分治思路(分治方向只往正確的方向走,也就是單通道,一直在重複一條遞迴道路,即最深的遞迴層的返回值可以返回至最外層。也就是說可以值返回一個結果,因此無需比較眾多的返回值結果)。設計遞迴出口,當哨兵位置恰好準確時,返回哨兵取值。否則分解為對應左右區間的子問題。
2.分解的區間為哨兵的左右區間,因此遞迴區間無需加入哨兵位置。
# 本題遇到bug,在借鑑快排思路時,只進行的左右各一次的填坑。並沒有結束第一輪填坑操作。所以,需要注意在使用快排時,最外層需要while(i<j)以便完成整輪快排。
class Solution { public: void dfs(vector<int>& arr, int l, int r){ if(l>=r) return; int pivot = arr[l]; int i = l; int j = r; while(i<j){while(i < j && arr[j] >= pivot){ j--; } arr[i] = arr[j]; while(i < j && arr[i] <= pivot){ i++; } arr[j] = arr[i]; } arr[i] = pivot; // 分治 dfs(arr, l, i-1); dfs(arr, i+1, r); } vector<int> getLeastNumbers(vector<int>& arr, int k) { dfs(arr, 0, arr.size()-1); vector<int> res; for(int i=0; i<k; i++){ res.push_back(arr[i]); } return res; } };