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] 就是答案
相关推荐
不会就选b16 分钟前
【无标题】
算法
m0_7393128732 分钟前
【自动驾驶和机器人控制】万向锁(Gimbal Lock)原理详解 + 和欧拉角 / 四元数 / SO(3)对比
算法·机器人·自动驾驶
Felven1 小时前
A. Eating Game
算法
专注仿真1 小时前
RabbitMQ消息队列实战项目
数据结构·rabbitmq
血小板要健康2 小时前
队列 + 宽搜(BFS):二叉树层序遍历 算法总结
java·数据结构·笔记·算法·leetcode·宽度优先
Felven2 小时前
A. Riptide
算法·c 算法
m0_739312872 小时前
四元数、李群SO(3)/李代数so(3)的作用及应用场景
算法·机器人·自动驾驶
artificiali2 小时前
880 第4章多元
人工智能·算法
Felven3 小时前
B. Deja Vu
数据结构·算法
小玮看世界3 小时前
[Python]螺旋遍历 vs 最短路径:方向控制类算法的“同源异流”
开发语言·python·算法