标签:
题目描述:输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
题目解析:首先想到的就是插入法,。改进一下就是前面一直保持7个有序数字。遍历剩下数组,元素若小于最大值就交换。用C++的set来解决代码就简洁多了,删除插入都是logk。
代码如下:
1 class Solution { 2 public: 3 vector<int> GetLeastNumbers_Solution(vector<int> input, int k) { 4 set<int> kset; 5 if(k <= 0 || input.size() < unsigned(k)) return vector<int>(0); 6 vector<int>::iterator iter = input.begin(), iend = input.end(); 7 while(k--) { 8 kset.insert(*iter++); 9 } 10 11 while(iter != iend) { 12 if(*iter < *kset.rbegin()) { 13 kset.erase(*kset.rbegin()); 14 kset.insert(*iter++); 15 } 16 else ++iter; 17 } 18 19 vector<int> ans(kset.begin(), kset.end()); 20 return ans; 21 } 22 };
拓展:quick select
标签:
原文地址:http://www.cnblogs.com/excavator/p/4824762.html