题目:
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
链接:
思路:
思路1:直接排序,选择前k个数即可,时间效率为nlogn(当然,也要看用什么排序算法了,用插入排序啥的,最坏的情况是n*n)
思路2(来自剑指offer):用堆存储k个数即可
1、遍历数字序列
2、将当前数字插入到正在维护的一个堆中,调整堆
3、如果堆的大小超过了k,就把最大的那个数删掉,调整堆
注意:如果k大于数字序列的长度,返回空
用思路二的话,时间效率为O(nlogk)(k<n)
代码:
1 class Solution { 2 private: 3 //ans先push一个元素后,再调整顺序 4 void insertBigHeap(vector<int> &ans){ 5 int k = ans.size() - 1; 6 while(k > 0){ 7 int p = (k - 1) >> 1; 8 if(ans[k] > ans[p]){ 9 int tmp = ans[k]; 10 ans[k] = ans[p]; 11 ans[p] = tmp; 12 k = p; 13 }else{ 14 return; 15 } 16 } 17 } 18 19 //删除ans最大的元素,即第一个元素 20 void delBigHeap(vector<int> &ans){ 21 if(ans.empty()){ 22 return; 23 } 24 int delNo = 0; 25 int len = ans.size(); 26 ans[delNo] = ans[len - 1]; 27 ans.pop_back(); 28 len = ans.size(); 29 while(2 * delNo + 1 < len){ 30 delNo = 2 * delNo + 1; 31 if(delNo < len - 1 && ans[delNo] < ans[delNo + 1]){ 32 ++ delNo; 33 } 34 35 int pNo = (delNo - 1) >> 1; 36 if(ans[pNo] < ans[delNo]){ 37 int tmp = ans[pNo]; 38 ans[pNo] = ans[delNo]; 39 ans[delNo] = tmp; 40 }else{ 41 return; 42 } 43 } 44 } 45 public: 46 vector<int> GetLeastNumbers_Solution(vector<int> input, int k) { 47 int len = input.size(); 48 vector<int> ans; 49 if(k <= 0 || len == 0 || k > len){ 50 return ans; 51 } 52 53 int index; 54 for(index = 0; index < len; ++ index){ 55 ans.push_back(input[index]); 56 insertBigHeap(ans); 57 if(ans.size() > k){ 58 delBigHeap(ans); 59 } 60 } 61 62 return ans; 63 } 64 };
浙公网安备 33010602011771号