&LeetCode0215&数组中的第K个最大元素

题目

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

示例 1:

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

示例 2:

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

说明:
你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。

来源:力扣(LeetCode

思路

维护一个大小为k的小根堆。

C++代码

//make_heap()是生成一个堆,大顶堆或小顶堆
//push_heap()是向堆中插入一个元素,并且使堆的规则依然成立
//pop_heap() 是在堆的基础上,弹出堆顶元素
//pop_back() 删除最后一个元素
class Solution {
public:
    int findKthLargest(vector<int>& nums, int k) 
    {
        vector<int> minstack(k);
        for (int i = 0; i < k; ++i)
        {
            minstack[i] = nums[i];
        }
        
        //创建小根堆
        make_heap(minstack.begin(), minstack.end(), greater<int>());
        
        for (int i = k; i < nums.size(); ++i)
        {
            //若比根节点大则插入
            if (nums[i] > minstack[0])
            {
                minstack.push_back(nums[i]);
                push_heap(minstack.begin(), minstack.end(), greater<int>());
            }
            if(minstack.size() > k)
            {
                pop_heap(minstack.begin(), minstack.end(), greater<int>());
                minstack.pop_back();
            }
        }
        return minstack[0];
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章