先全部排序只有在同一批資料要查很多次才值得;這題只查一次,第k大沒必要花 O(n log n) 排完整陣列
nth_element,平均 O(n),只把第 k 大元素放到正確位置,不排其他元素
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) { // 找第 k 大
nth_element(nums.begin(), nums.begin() + k - 1, nums.end(), greater<int>()); // 只定位第 k 大
return nums[k - 1]; // 回傳第 k 大
}
};
4.關鍵差異:
Min Heap = O(n log k)、
完整排序 = O(n log n)、
Quickselect / nth_element = 平均 O(n),速度use last one
nth_element是C++ STL(Standard Template Library,標準模板函式庫)裡的「部分排序」工具:不全排,只保證指定位置放上「排序後本來應該在那裡的元素」。
6.how
把第 n 個位置放成「如果整體排序後,本來就應該在那裡的元素」,但左右兩邊不會完整排序。
非「記憶絕對位置」,而是靠 partition(分割),概念很像 Quickselect(快速選擇):
nums = [3,2,1,5,6,4]要第 2 大;nth_element(..., k-1, ..., greater())
它會一直選一個 pivot(基準值),把:比 pivot 大的 → 左邊;比 pivot 小的 → 右邊
然後只繼續處理「第 k 大所在的那一側」,不用把全部排好。最後可能變成:
[6,5,3,4,2,1]
↑
第 2 大 = 5 注意左邊、右邊不保證完整排序;只保證:nums[k-1] 就是第 k 大。
所以它快的關鍵就是:只定位目標位置,不浪費時間排序其他元素。nice