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] 就是答案
相关推荐
老赵聊算法、大模型备案1 小时前
从剪映、即梦 AI 被罚,读懂 AI 生成内容标识硬性合规要求
人工智能·算法·安全·aigc
苏渡苇1 小时前
Redis 核心数据结构(二)——List 与消息队列
数据结构·redis·list·redis发布订阅
shehuiyuelaiyuehao1 小时前
算法12,滑动窗口,将x减到0的最小操作数
java·数据结构·算法
6Hzlia2 小时前
【Hot 100 刷题计划】 LeetCode 19. 删除链表的倒数第 N 个结点 | C++ 双指针单趟遍历
c++·leetcode·链表
_深海凉_2 小时前
LeetCode热题100-跳跃游戏 II
算法·leetcode·游戏
csuzhucong2 小时前
力扣OJ(2301-2600)
算法·leetcode·职场和发展
玛丽莲茼蒿2 小时前
Leetcode hot100 旋转图像【中等】
算法·leetcode·职场和发展
阿Y加油吧2 小时前
堆 / 优先队列专题二刷笔记:前 K 个高频元素 & 数据流的中位数
java·笔记·算法
Chase_______2 小时前
LeetCode 2090 题解:半径为 k 的子数组平均值,定长滑动窗口经典题一文搞懂
算法·leetcode·职场和发展