剑指offer29 ——最小K个数题解
剑指offer29题:输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
解法一:最简单的解法,先排序,再选前k个。
ps:sort排序使用的是改进的快排,数据量大时采用QuickSort快排算法,分段归并排序。一旦分段后的数据量小于某个门槛(16),为避免QuickSort快排的递归调用带来过大的额外负荷,就改用Insertion Sort插入排序。如果递归层次过深,还会改用HeapSort堆排序。
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
if(input.size()<k)
return {};
vector<int> result;
sort(input.begin(),input.end());
for(int i=0;i<k;i++)
{
result.push_back(input[i]);
}
return result;
}
};
方法二:使用堆排序比快排最坏的时间复杂度n方要快
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k){ //堆排序
if(k>input.size())
{
return {};
}
vector<int> result(input.begin(),input.begin()+k);
make_heap(result.begin(),result.end()); //建立最大堆
for(int i=k;i<input.size();i++)
{
if(result[0]>input[i])
{
pop_heap(result.begin(),result.end()); //把最大值移到最后一个元素
result.pop_back(); //移除最后一个元素
result.push_back(input[i]);
push_heap(result.begin(),result.end()); //重新选出最大值
}
}
sort_heap(result.begin(),result.end());
return result;
}
};