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);
}
};