【LeetCode每日一題】最小的k個數

輸入整數數組 arr ,找出其中最小的 k 個數。例如,輸入4、5、1、6、2、7、3、8這8個數字,則最小的4個數字是1、2、3、4。

示例 1:

輸入:arr = [3,2,1], k = 2
輸出:[1,2] 或者 [2,1]
示例 2:

輸入:arr = [0,1,2,1], k = 1
輸出:[0]

限制:

0 <= k <= arr.length <= 10000
0 <= arr[i] <= 10000

C++1 排序

對數組排序之後取前k個元素即可。

class Solution {
public:
    vector<int> getLeastNumbers(vector<int>& arr, int k) {
        sort(arr.begin(), arr.end());
        vector<int> res;
        for(int i=0;i<k;i++){
            res.push_back(arr[i]);
        }
        return res;
    }
};

使用大頂堆

用大根堆實時維護數組的前 k 小值。首先將前 k 個數插入大根堆中,隨後從第 k+1 個數開始遍歷,如果當前遍歷到的數比大根堆的堆頂的數要小,就把堆頂的數彈出,再插入當前遍歷到的數。最後將大根堆裏的數存入數組返回即可。

class Solution {
public:
    vector<int> getLeastNumbers(vector<int>& arr, int k) {
        vector<int> res(k, 0);
        if (k == 0) return res; // 排除 0 的情況
        priority_queue<int> que;
        for (int i = 0; i < k; ++i) que.push(arr[i]);
        for (int i = k; i < (int)arr.size(); ++i) {
            if (que.top() > arr[i]) {
                que.pop();
                que.push(arr[i]);
            }
        }
        for (int i = 0; i < k; ++i) {
            res[i] = que.top();
            que.pop();
        }
        return res;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章