秋招刷題:最小的k個數字

  • 題目:輸入n個整數,找出其中最小的K個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,。
  • code
  • idea:使用堆排序的思路。建立最小堆,當前i個數已經排列好後,以i+1到len-1區間的數組建立最小堆,依次迭代,直到直到最小k個數。
  • 注意!計算父節點時計算公式爲(i+begin-1)/2。理由:在完全二叉樹中,左子點的父節點的座標爲(i+begin-1)/2(此時沒有餘數),右子點的父節點的座標爲(i+begin-2)/2(此時沒有餘數),不管左右結點(i+begin-1)/2都爲父節點,只是右結點餘數爲1。
class Solution {
public:
    
    
    void build(vector<int> &in, int begin){
        int len = in.size() - begin;
        if (len <= 0) return;
        for (int i = len-1; i>=begin; i--){
            int f_index = (i+begin-1)/2;
            if (in[i]<in[f_index]){
                swap(in[i],in[f_index]);
            }
                
        }
    }
    
    vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
        int len = input.size();
        if (len == 0 || len < k){
            vector<int> b;
            return b;
        }
        for (int i = 0; i < k; i++){
            build(input, i);
        }
        vector<int> res(input.begin(), input.begin()+k);
        return res;
    }
    
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章