劍指offer刷題————最小的k個數

問題重述:

題目:輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個主子,則最小的4個數字是1、2、3、4。

思路解析:

在不改變原數組的基礎上,我們可以建立一個大根堆,然後將數組的前k個數字插入到大根堆中。然後從位置k處開始繼續遍歷數組,依次與堆頂元素比較,如果這個元素小於堆頂元素,那麼我們剔除堆頂元素,並且將此元素插入到堆中。當遍歷完整個數組之後,堆中的元素就是最小的k個數。

代碼實現:

class Solution {
public:
    vector<int> GetLeastNumbers_Solution(vector<int> input, int k)
    {
        if(k<1)
            return vector<int>();
        if(k>input.size())
            return vector<int>();
        vector<int> result;
        priority_queue<int,vector<int>,less<int>>  heap;//大根隊
        for(int i = 0;i<k;++i)
        {
            heap.push(input[i]);
        }
        for(int i = k;i<input.size();++i)
        {
            if(input[i]<heap.top())
            {
                heap.pop();
                heap.push(input[i]);
            }
        }
        while(!heap.empty())
        {
            result.push_back(heap.top());
            heap.pop();
        }
        return result;
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章