前k个最大元素,用堆来做,时间复杂度是O(Nlogk)
第k个最大元素,用快排思想,分治来做,时间复杂度是O(N)
建议背下以下对称的partion操作模板,以第一个数为pivot,一般面试中不用考虑随机优化。
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
int n = nums.size();
srand(time(NULL));
helper(nums,0,n-1,k);
return nums[n-k];
}
void helper(vector<int>& nums, int start, int end, int k){
if(start>=end) return;
// 一般选择第一个元素作为pivot,使用随机交换的方法优化
int index = rand()%(end-start+1)+start;
swap(nums[start],nums[index]);
int key = nums[start], left = start, right = end;
while(left<right){
while(left<right&&nums[right]>=key) right--;
swap(nums[left],nums[right]);
while(left<right&&nums[left]<=key) left++;
swap(nums[left],nums[right]);
}
if(end-left+1==k) return;
else if(end-left+1>k) helper(nums,left+1,end,k);
else helper(nums,start,left-1,k-(end-left+1));
}
};