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

image

 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.

image

 

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

 

posted on 2025-09-11 23:49  Coder何  阅读(6)  评论(0)    收藏  举报