leetcode215. 数组中的第K个最大元素

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

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

思路:
寻找数组当中的第K大元素,有以下两个步骤:

  1. 先用数组当中的前K个元素构建小堆。
  2. 将数组当中剩余元素与堆顶元素进行比较,若比堆顶元素大,则将堆顶元素弹出,将该元素入堆,并对堆进行调整使其仍为小堆。

如此进行下去,直到数组遍历结束,此时堆顶的元素便是数组当中的第K个最大元素。因为此时堆当中的K个元素便是数组当中最大的K个元素,而堆顶又是这K个元素当中最小的元素,所以堆顶元素就是数组当中的第K大元素。

代码如下:

class Solution {
public:
	int findKthLargest(vector<int>& nums, int k) {
		//先用数组当中的前K个元素构建小堆
		priority_queue<int, vector<int>, greater<int>> q(nums.begin(), nums.begin() + k);
		//处理数组剩余元素
		for (size_t i = k; i < nums.size(); i++)
		{
			if (nums[i] > q.top()) //若比堆顶元素大
			{
				q.pop(); //将堆顶元素弹出
				q.push(nums[i]); //将该元素入堆
			}
		}
		return q.top(); //返回堆顶元素即为数组当中的第K个最大元素
	}
};
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

2021dragon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值