最小的k个数
排序问题,取前k个值
用冒泡排序,时间复杂度O(n*k);
用快速排序,时间复杂度O(nlogn);
用堆排序,构建最大堆。时间复杂度为O(nlogk)。
依题意,在n较大,k较小的情况下用堆排序。
堆的构造:
1)先构建前k个数的最大堆 2)从第k个数开始于堆顶比较,如果比堆顶小则交换,维持最大堆 3)堆中的前k个数
主要代码如下:
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
int len=input.size();
if(len<=0||k>len) return vector<int>();
for(int i=0;i<k;i++) res.push_back(input[i]);
//建堆
make_heap(res.begin(),res.end());
for(int i=k;i<len;i++)
{
if(input[i]<res[0])
{
//先pop,然后在容器中删除
pop_heap(res.begin(),res.end());
res.pop_back();
//先在容器中加入,再push
res.push_back(input[i]);
push_heap(res.begin(),res.end());
}
}
//使其从小到大输出
sort_heap(res.begin(),res.end());
return res;
}
};