Leetcodehot100-215. 数组中的第K个最大元素

复制代码
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);
    }
};
  1. 选择枢轴(tmp) :通常选择左端元素 nums[l]

  2. 分区:重排数组,使得:

    • 左边部分([l..j])的所有元素 <= 枢轴

    • 右边部分([j+1..r])的所有元素 >= 枢轴

    • 注意:枢轴不一定在正中间,且 j 是分界点

  3. 判断并递归:

    • 如果目标索引 k <= j,说明第 k 小的元素在左半部分 → 递归左半

    • 否则在右半部分 → 递归右半

  4. 终止条件:

    • 当 l == r 时,区间只有一个元素,nums[k] 就是答案
相关推荐
UIU1149 小时前
P1233 [ICPC 2001 Taejon R] 木棍加工
数据结构·c++·算法·动态规划
论文复现现场10 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
ZhengEnCi10 小时前
用 AI 写代码为什么拼到最后还是拼人:算力瓶颈与领域专家提示词的本质差异
算法·架构
秋天的怀念_David11 小时前
第二十一夜 · 数字黑洞与西西弗斯的惩罚
java·程序人生·算法
碧海银沙音频科技研究院12 小时前
在PC电脑上用Whisper→Marian算法实现离线语音翻译功能
算法·whisper
niyongsheng12 小时前
3D 装箱算法工程化:数据结构、放置启发式与支撑规则
数据结构·算法·rust
叉烧滑蛋14 小时前
B站台湾大学郭彦甫|MATLAB 学习笔记|04 变量与档案存取
数据结构
j7~14 小时前
【穷举、深搜与回溯算法】一棵决策树讲透全排列与子集
数据结构·c++·算法·leetcode·回溯·递归
傅科摆 _ py15 小时前
DP,贪心,堆和栈,二分力扣复习
开发语言·python·算法
Shaoshing16 小时前
LeetCode100 42.接雨水
java·算法·leetcode