[模板]過載運算子高精
阿新 • • 發佈:2022-04-11
劍指 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; } };