题目描述
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,
解法1;利用最大堆,O(nlogk)
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
if(input.empty()||k>input.size()||k<=0)
return {};
vector<int>heap_input(input.begin(),input.begin()+k);
make_heap(heap_input.begin(),heap_input.end());
for(int i=k;i<input.size();i++)
{
if(input[i]<*heap_input.begin())
{ pop_heap(heap_input.begin(),heap_input.end());
heap_input.pop_back();
heap_input.push_back(input[i]);
push_heap(heap_input.begin(),heap_input.end());
}
}
return heap_input;
}
注意题目条件要考虑周期,对于k<=0这种情况开始没有考虑,导致在牛客网上编译通不过。
解法2:利用全排序 时间复杂度O(nlogn)
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
if(input.empty()||k>input.size())
return {};
vector<int>res;
sort(input.begin(),input.end());
for(int i=0;i<k;i++)
{
res.push_back(input[i]);
}
return res;
}