稀碎从零算法笔记Day25-LeetCode:数组中的第K个最大元素

题型:排序、堆

链接:215. 数组中的第K个最大元素 - 力扣(LeetCode)

来源:LeetCode

题目描述

给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。(降序排列后的第K个元素)

请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。

题目样例

示例 1:

输入: [3,2,1,5,6,4], k = 2
输出: 5

示例 2:

输入: [3,2,3,1,2,4,5,5,6], k = 4
输出: 4

提示:

  • 1 <= k <= nums.length <= 105
  • -104 <= nums[i] <= 104

题目思路

题目数据少的话,可以快排,然后返回第K个元素(但考虑到如果数组本身就是有序的,快排可能会炸掉,所以最好用STL的sort来排序),然后返回第K个元素。或者选择更为高效的排序算法。

如果不受限于排序,可以尝试建立一个“小根堆”,然后不断维护这个堆,最终返回堆顶元素(此时堆顶元素是K个最大的元素中最小的那一个)

小根堆的建立 可以用优先队列实现

C++代码

STL sort函数偷懒

class Solution {
public:
    int findKthLargest(vector<int>& nums, int k) {
        // 排序
        
        sort(nums.begin(),nums.end(),greater<int>());//greater<>() 表示倒序排列
        return nums[k-1];
    }
};

优先队列建堆

class Solution {
public:
    int findKthLargest(vector<int>& nums, int k) {
        // 小根堆 根节点就是第 k 大的元素
        // 优先队列,但是降序
        priority_queue<int,vector<int>,greater<int>> xgheap;
        for(auto num : nums)
        {
            xgheap.push(num);
            if(xgheap.size() > k)
                xgheap.pop();
        }
        return xgheap.top();

    }
};

结算页面 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值