题目
题目描述
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。
示例1
输入
[4,5,1,6,2,7,3,8],4
返回值
[1,2,3,4]
解析
需要考虑边界问题:n小于k!
k轮的冒泡排序
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
int len=input.size();
if(len<k)return {};
vector<int> res;
int j=0;
for(int i=0;i<k;++i){
for(j=0;j<len-1-i;++j){
if(input[j]<input[j+1]){
swap(input[j],input[j+1]);
}
}
res.push_back(input[j]);
}
return res;
}
};
小顶堆
class Solution {
public:
vector<int> getLeastNumbers(vector<int>& arr, int k) {
vector<int>vec(k, 0);
if (k == 0) { // 排除 0 的情况
return vec;
}
priority_queue<int> Q;
//前k个数入堆
for (int i = 0; i < k; ++i) {
Q.push(arr[i]);
}
//把剩余的数入堆,保证堆里只有k个数
for (int i = k; i < (int)arr.size(); ++i) {
if (Q.top() > arr[i]) {
Q.pop();
Q.push(arr[i]);
}
}
//将结果保存在vec中
for (int i = 0; i < k; ++i) {
vec[i] = Q.top();
Q.pop();
}
return vec;
}
};

本文介绍了解决寻找最小K个数问题的两种高效算法:k轮冒泡排序法和小顶堆法。通过具体示例展示了每种方法的实现过程及代码实现。对于大规模数据集,小顶堆法更为高效。


被折叠的 条评论
为什么被折叠?



