iT邦幫忙

2026 iThome 鐵人賽

DAY 19
1
Software Development

快樂演算法系列 第 19

Ground Truth 好好存放努力中嗚嗚 & 215

  • 分享至 

  • xImage
  •  
  1. 先全部排序只有在同一批資料要查很多次才值得;這題只查一次,第k大沒必要花 O(n log n) 排完整陣列

  2. 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


上一篇
The second drone has been successfully built & 102 v2
下一篇
YOLOE後覆核web出現了還有api存好存滿 欣喜若狂(? & 215 v2
系列文
快樂演算法22
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
RayYuanLiu
iT邦新手 4 級 ‧ 2026-09-08 13:30:14

這題有不好的回憶...

又不好了嗎:“(會變成好的嗚嗚

我要留言

立即登入留言