Shirlies
宁静专注认真的程序媛~

题目:

输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。

链接:

http://www.nowcoder.com/practice/6a296eb82cf844ca8539b57c23e6e9bf?tpId=13&tqId=11182&rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

思路:

思路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 };

 

posted on 2016-09-05 14:07  Shirlies  阅读(386)  评论(0)    收藏  举报