剑指 Offer 40. 最小的k个数
输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。
思路
方法一:排序
对原数组从小到大排序后取出前 k 个数即可。
方法二:堆
用一个大根堆实时维护数组的前 k 小值。
方法三:快排思想
注意,题目只需要返回最小的 k 个数字,而没有要求这 k 个数字一定是有序的。
这个有点难,待填坑。。。
代码
方法一
也可以自己手写快排,我调的库
class Solution {
public:
vector<int> getLeastNumbers(vector<int>& arr, int k) {
sort(arr.begin(), arr.end());
vector<int> ans(arr.begin(), arr.begin() + k);
return ans;
}
};
方法二
class Solution {
public:
vector<int> getLeastNumbers(vector<int>& arr, int k) {
vector<int> ans;
if (k == 0) return ans;
priority_queue<int> q;
for (int i = 0; i < k; ++i) {
q.push(arr[i]);
}
for (int i = k; i < arr.size(); ++i) {
if (arr[i] < q.top()) {
q.pop();
q.push(arr[i]);
}
}
while (!q.empty()) {
ans.push_back(q.top());
q.pop();
}
// reverse(ans.begin(), ans.end());
return ans;
}
};