面試題40. 最小的k個數(堆排序)

面試題40. 最小的k個數

輸入整數數組 arr ,找出其中最小的 k 個數。例如,輸入4、5、1、6、2、7、3、8這8個數字,則最小的4個數字是1、2、3、4。

 

示例 1:

輸入:arr = [3,2,1], k = 2
輸出:[1,2] 或者 [2,1]

示例 2:

輸入:arr = [0,1,2,1], k = 1
輸出:[0]

思路:用庫函數做就沒意思了,這道題我主要用來複習一下手撕堆排序(算法筆記上的)

完整代碼:

class Solution {
public:
    //調整位置函數,讓下標爲low的元素找到自己的位置
    void downAdjust(int low,int high,vector<int>& arr){
        int i = low;
        int j = i*2+1;
        while(j<high){
            if(j+1<high&&arr[j]<arr[j+1]){
                ++j;
            }
            if(arr[i]<arr[j]){
                swap(arr[i],arr[j]);
                i = j;
                j = i*2+1; //注意下標是從0開始的,所以左孩子爲i*2+1,右孩子爲i*2+2
            }
            else break;
        }
    }
    //建堆
    void createHeap(vector<int>&arr){
        int size = arr.size();
        for(int i = size/2;i>=0;i--){
            downAdjust(i,size-1,arr);
        }
    }
    //堆排序
    void heapSort(vector<int>&arr){
        createHeap(arr);
        for(int i = arr.size()-1;i>=0;i--){
            swap(arr[0],arr[i]);
            downAdjust(0,i,arr);
        }
    }
    vector<int> getLeastNumbers(vector<int>& arr, int k) {
        heapSort(arr);
        vector<int> res;
        if(arr.size()==0)return res;
        for(int i = 0;i<k;i++){
            res.push_back(arr[i]);
        }
        return res;
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章