215. 數組中的第K個最大元素
這裏使用的是快速排序的思想,快排是每一次確定一個數的位置,左邊的都比它小,右邊的都比他大。
但是直接用快排會需要更多的時間,這裏相當於對快排進行剪枝,把快排中不需要的步驟去掉
每次確定一個數的位置之後,如果第K個最大元素在左邊,則只對左邊進行搜索,否則對右邊搜索
當然,快排中的其他的優化也可以用在這裏,比如取任意三個數中的中數來定位,或者是在搜索空間小於n=5時進行遍歷,都可以。
class Solution {
public:
int find(vector<int>& nums, int k, int r, int l){
int a = r, b = l;
int flag = nums[r];
while(r < l){
while(r < l&&nums[l] >= flag) l --;
if(r >= l) break;
nums[r++] = nums[l];
//if(k > l||k < r) break;
while(r < l&&nums[r] <= flag) r ++;
if(r >= l) break;
nums[l--] = nums[r];
//if(k < r||k > l) break;
}
if(k < r)
return find(nums, k, a, r-1);
else if(k > l)
return find(nums, k, l+1, b);
else
return flag;
}
int findKthLargest(vector<int>& nums, int k) {
return find(nums, nums.size()-k, 0, nums.size()-1);
}
};