数组中最大的第K个元素

本文详细介绍了如何利用C++的优先队列(priority_queue)来解决LeetCode上的第k大元素问题。通过对比不同解法的时间复杂度,重点阐述了利用小顶堆(greater<int>)实现的方法,该方法在数据规模远大于k的情况下效率较高,时间复杂度为O(N+K*logK)。文章还提供了完整的C++代码实现,有助于读者理解和应用此算法。
摘要由CSDN通过智能技术生成

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/kth-largest-element-in-an-array

题目描述:

给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。
请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

输入:

[3,2,1,5,6,4] 和 k = 2

输出:

5

解题思路(此解法相对比较优化):

  1. 利用priority_queue建立堆
  2. priority_queue默认为建立大堆
  3. 通过出堆,即可找出数据
class Solution {
public:
    int findKthLargest(vector<int>& nums, int k) {
    //方法一:先排序,升序,再从往前找
    //时间复杂度:O(N*logN)
       // sort(nums.begin(),nums.end());
       // return nums[nums.size()-k];

       //方法二:先排序,利用模板参数,直接降序排序,再从前往后找
       //时间复杂度:O(N*logN)
       //sort(nums.begin(),nums.end(),greater<int>());
       //return nums[k-1];

	//方法三:先放数据在priority_queue中,再删除前k-1个数
	//时间复杂度:O(N+K*logK)
	//若N远远大于K,这这方法更适用
		//priority_queue<int> p(nums.begin(),nums.end())
		//for(int i = 0; i < k-1; i++)
		//{
		//	p.pop();
		//}
		//return p.top();

	//方法四:
       //构建k个数的小堆,最优化
       //时间复杂度:O(K+(N-K)*logK)
        priority_queue<int,vector<int>,greater<int>> KMinHeap(nums.begin(),nums.begin()+k);
        for(size_t i = k; i < nums.size(); ++i)
        {
             if(nums[i] > KMinHeap.top())
             {
                 KMinHeap.pop();
                 KMinHeap.push(nums[i]);
             }
        }
        return KMinHeap.top();

    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值