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] 就是答案
相关推荐
BothSavage4 小时前
Trae远程开发中DeepSeek自定义模型4054错误的排查与修复
算法
小林ixn5 小时前
从暴力到KMP:一道题彻底搞懂字符串匹配的前世今生
算法
烬羽6 小时前
字符串算法入门:从反转字符串到回文判断,面试不再慌
算法·面试
先吃饱再说1 天前
判断回文字符串,从一行代码到双指针优化
算法
黄敬峰1 天前
深入理解算法核心:从递归思想、数组扁平化到快速排序
算法
得物技术1 天前
从狂野代码到按目标生产:得物推荐 AI Harness 的工程化实践|AICon 演讲整理
人工智能·算法·架构
AI小老六1 天前
SkillOpt 架构拆解:把 Skill 文本当参数,用执行轨迹训练 Agent
后端·算法·ai编程
胡萝卜术1 天前
从“分数打架”到“排名投票”:为什么你的ChatBI必须用RRF?
算法·设计模式·面试
Asize1 天前
初识DFS 与 BFS:递归、队列与图遍历
算法