输入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; }