複習堆

面試題 17.14. 最小K個數

示例

輸入: arr = [1,3,5,7,2,4,6,8], k = 4
輸出: [1,2,3,4]

提示

  • 0 <= len(arr) <= 100000
  • 0 <= k <= min(100000, len(arr))
class Solution {
public:
    vector<int> smallestK(vector<int>& arr, int k) {
        for(int i = 0; i < arr.size(); i++)
        {
            heapInsert(arr, i);
        }
        vector<int> res;
        int heapSize = arr.size();
        for(int i = 0; i < k; i++)
        {
            res.push_back(arr[0]);
            swap(arr[0], arr[--heapSize]);
            heapify(arr, 0,heapSize);
        }
        return res;
    }
    void heapInsert(vector<int>& arr, int index)
    {
        
        while(arr[index] < arr[(index-1)/2])
        {
            swap(arr[index], arr[(index-1)/2]);
            index = (index-1)/2;
        }
    }
    void heapify(vector<int>& arr, int index, int k)
    {
        int left = index *2 + 1;
        while(left < k)
        {
            int largest = (left+1 < k)&& (arr[left+1] < arr[left])? left+1:left;
            largest = arr[largest] < arr[index] ? largest:index;
            if(index == largest)
                break;
            swap(arr[index], arr[largest]);
            index = largest;
            left = index * 2 +1;
        }


    }
};

未完待續。。。

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