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

题目来源:力扣

题目描述:

给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。

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

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

代码:

cpp 复制代码
    int findKthLargest(vector<int>& nums, int k) {
        //N
        priority_queue<int> pq(nums.begin(),nums.end());
        //K*logN
        while(--k){
            pq.pop();
        }
        return pq.top();
    }

这道题我们可以建大堆,也可以建小堆,这是大堆的玩法

当数据量较大时,尤其是文件这种,是需要建小堆的,下面我们来建小堆

cpp 复制代码
    int findKthLargest(vector<int>& nums, int k) {
        //N
        priority_queue<int,vector<int>,greater<int>> pq(nums.begin(),nums.begin()+k);
        //(N-K)*logK
        for(int i=k;i<nums.size();i++){
            if(nums[i]>pq.top()){
                pq.pop();
                pq.push(nums[i]);
            }
        }
        return pq.top();
    }

这是小堆的玩法,我们对前k-1个数据建堆,然后从第k个数据开始,如果这个数据比堆顶数据要大,就替换这个数据,这样我们得到的就是由整个数组中前k大的数据构建成的小堆,而堆顶自然是第k大的数据

这道题我们其实还可以直接排序过的,大家遇到实在不会的,可以先找个简单的方法试一试

这里有一个问题

我们发现,sort里传的有括号,而下面的优先级队列里没有括号

原因是上面的sort是一个函数模板,要传对象,我们传的是匿名对象,而下面的是类模板,要传类型,所以不加括号

相关推荐
孤飞7 小时前
zero2Agent:面向大厂面试的 Agent 工程教程,从概念到生产的完整学习路线
算法
lclin_20208 小时前
VS2010兼容|C++系统全能监控工具(彩色界面+日志带单位+完整版)
c++·windows·系统监控·vs2010·编程实战
技术专家8 小时前
Stable Diffusion系列的详细讨论 / Detailed Discussion of the Stable Diffusion Series
人工智能·python·算法·推荐算法·1024程序员节
csdn_aspnet8 小时前
C# (QuickSort using Random Pivoting)使用随机枢轴的快速排序
数据结构·算法·c#·排序算法
鹿角片ljp9 小时前
最长回文子串(LeetCode 5)详解
算法·leetcode·职场和发展
广师大-Wzx10 小时前
一篇文章看懂MySQL数据库(下)
java·开发语言·数据结构·数据库·windows·python·mysql
paeamecium10 小时前
【PAT甲级真题】- Cars on Campus (30)
数据结构·c++·算法·pat考试·pat
UrSpecial11 小时前
从零实现C++轻量线程池
c++·线程池
chh56311 小时前
C++--模版初阶
c语言·开发语言·c++·学习·算法
RTC老炮11 小时前
带宽估计算法(gcc++)架构设计及优化
网络·算法·webrtc