&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];
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章