力扣215. 数组中的第K个最大元素

1.二叉最小堆法:维护一个size为k的最小堆,每次从堆中去除一个比item更小的元素,最后留下的便是最大的k个元素。(nlogn)
1 class Solution { 2 public: 3 int findKthLargest(vector<int>& nums, int k) { 4 priority_queue<int, vector<int>, greater<int>> heap; 5 for (int item : nums) { 6 heap.push(item); 7 if (heap.size() > k) { 8 heap.pop(); 9 } 10 } 11 return heap.top(); 12 } 13 };
2.快速选择法:
为了解决存在相同元素的问题,需要注意
1. 必须使用do while
// 假设数组: [3, 3, 3, 3], pivot=3
while(nums[i] < p) {++i;} // 永远不会进入,i停留在l
while(nums[j] > p) {--j;} // 永远不会进入,j停留在r
// i和j都不移动,死循环!
2.

1 class Solution { 2 public: 3 int partition(vector<int>& nums, int l, int r, int k) { 4 if (l == r) { 5 return nums[l]; 6 } 7 int p = nums[l]; 8 int i = l - 1, j = r + 1; 9 while(i < j) { 10 do i++; while(nums[i] < p); 11 do j--; while(nums[j] > p); 12 if (i < j) 13 swap(nums[i], nums[j]); 14 } 15 if (k > j) { 16 return partition(nums, j + 1, r, k); 17 } else { 18 return partition(nums, l, j, k); 19 } 20 } 21 int findKthLargest(vector<int>& nums, int k) { 22 return partition(nums, 0, nums.size() - 1, nums.size() - k); 23 24 } 25 };
浙公网安备 33010602011771号