輸入整數數組 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;
}
};