class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
// 1. 把所有元素放入最大堆
priority_queue<int> pq; // 最大堆,堆顶是最大值
for(int i=0; i<nums.size(); ++i) {
pq.push(nums[i]);
}
// 2. 弹出前 k-1 个最大值
for(int i=k-1; i>0; i--) {
pq.pop(); // 弹出最大值、第二大值...
}
// 3. 堆顶就是第 k 大的值
return pq.top();
}
};
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
// 最小堆,只维护 k 个最大的元素
priority_queue<int, vector<int>, greater<int>> pq;
for(int num : nums) {
pq.push(num);
if(pq.size() > k) {
pq.pop(); // 弹出最小的,保持堆大小为 k
}
}
return pq.top(); // 堆顶是第 k 大的
}
};
class Solution {
public:
int quickselect(vector<int>& nums, int left,int right,int k){
if(left==right){
return nums[k];
}
int i=left-1,j=right+1;
int tmp=nums[left];
while(i<j){
do i++; while (nums[i] < partition); // 找到左边第一个 >= tmp 的元素
do j--; while (nums[j] > partition); // 找到右边第一个 <= tmp 的元素
if(i<j) swap(nums[i],nums[j]);
}
if(k<=j) return quickselect(nums,left,j,k);
else return quickselect(nums,j+1,right,k);
}
int findKthLargest(vector<int>& nums, int k) {
int sz=nums.size();
return quickselect(nums,0,sz-1,sz-k);
}
};
-
选择枢轴(tmp) :通常选择左端元素
nums[l] -
分区:重排数组,使得:
-
左边部分(
[l..j])的所有元素 <= 枢轴 -
右边部分(
[j+1..r])的所有元素 >= 枢轴 -
注意:枢轴不一定在正中间,且
j是分界点
-
-
判断并递归:
-
如果目标索引
k <= j,说明第 k 小的元素在左半部分 → 递归左半 -
否则在右半部分 → 递归右半
-
-
终止条件:
- 当
l == r时,区间只有一个元素,nums[k]就是答案
- 当