题目
输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。
看到即想到的解法
看到这个题就想到了sort
但是如果面试的时候和面试官说sort
可能你就中奖了
vector<int> getLeastNumbers(vector<int>& arr, int k) {
sort(arr.begin(), arr.end());
arr.resize(k);
return arr;
}
最大堆(优先队列)
如果看过我之前写的文章的朋友们可能知道最大堆也叫优先队列这个容器
因为其具有队列的性质,所以可以用到这道题上
我们首先将数组中前k个元素插入到堆中
然后遍历之后的元素
如果发现之后的元素小于队首的元素
让这个元素出队 让后边的元素入队
前k个元素其他的就会顶上来
这样以达成我们想要的结果
vector<int> getLeastNumbers(vector<int>& arr, int k) {
priority_queue <int> q;//最大堆(优先队列)
vector<int> ans;
if (k == 0) { // 排除 0 的情况
return ans;
}
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]);
}
}
for (int i = 0; i < k; i++) {
ans.push_back(q.top());
q.pop();
}
return ans;
}
之后可能会更新新的解法
希望我所写的对大家有帮助