题目描述
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
思路1:快速排序 O(nlogn)。 先sort排序,然后再取最小的k个
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
if (input.size() == 0 || k <= 0 || k > input.size()) return {};
sort(input.begin(), input.end());
vector<int> res(k); //初始化k个默认值为0的元素 ,(k,0)
for (int i = 0; i < k; i++)
res[i]=input[i];
return res;
}
};
思路2:推排序 O(nlogn) 。 构造大顶堆
1)使用库函数
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
if (input.size() == 0 || k <= 0 || k > input.size()) return {};
vector<int> res(input.begin(), input.begin() + k);
make_heap(res.begin(),res.end()); //建堆
for (int i = k; i < input.size(); i++) {
if (input[i] < res[0]) {
pop_heap(res.begin(), res.end());
res.pop_back();
res.push_back(input[i]);
push_heap(res.begin(), res.end());
}
}
sort_heap(res.begin(), res.end());
return res;
}
};
2)使用优先队列 priority_queue
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
if (input.size() == 0 || k <= 0 || k > input.size()) return {};
vector<int> res;
priority_queue<int> q;
for (int i = 0; i < input.size(); i++) {
if (q.size() < k) q.push(input[i]);
else if (q.top() > input[i]) {
q.pop();
q.push(input[i]);
}
}
while (!q.empty())
{
res.push_back(q.top());
q.pop();
}
return res;
}
};