剑指offer | 最小的K个数

题目描述:输入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

posted on 2015-09-20 23:37  Excavator  阅读(171)  评论(0编辑  收藏  举报

导航