1. 程式人生 > 其它 >[模板]過載運算子高精

[模板]過載運算子高精

劍指 Offer 40. 最小的k個數

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

思路

方法一:排序

對原陣列從小到大排序後取出前 k 個數即可。

方法二:堆

用一個大根堆實時維護陣列的前 k 小值。

方法三:快排思想

注意,題目只需要返回最小的 k 個數字,而沒有要求這 k 個數字一定是有序的。

這個有點難,待填坑。。。

程式碼

方法一

也可以自己手寫快排,我調的庫

class Solution {
public:
    vector<int> getLeastNumbers(vector<int>& arr, int k) {
        sort(arr.begin(), arr.end());
        vector<int> ans(arr.begin(), arr.begin() + k);
        return ans;
    }
};

方法二

class Solution {
public:
    vector<int> getLeastNumbers(vector<int>& arr, int k) {
        vector<int> ans;
        if (k == 0) return ans;
        priority_queue<int> q;
        for (int i = 0; i < k; ++i) {
            q.push(arr[i]);
        }
        for (int i = k; i < arr.size(); ++i) {
            if (arr[i] < q.top()) {
                q.pop();
                q.push(arr[i]);
            }
        }
        while (!q.empty()) {
            ans.push_back(q.top());
            q.pop();
        }
        // reverse(ans.begin(), ans.end());
        return ans;
    }
};