iT邦幫忙

2026 iThome 鐵人賽

DAY 20
1
Software Development

快樂演算法系列 第 20

YOLOE後覆核web出現了還有api存好存滿 欣喜若狂(? & 215 v2

  • 分享至 

  • xImage
  •  

nth_element(nums.begin(), nums.begin() + k - 1, nums.end(), greater<int>());
nums.begin():陣列第一個位置
nums.begin() + k - 1:目標位置,也就是「第 k 大要放的位置」
nums.end():陣列最後一個位置的後一格
greater():用「大到小」的規則比較
nth_element(...):只保證目標位置正確,不保證整體排序
return nums[k - 1];
nums[k - 1]:取出剛剛定位好的第 k 大
k - 1:因為 C++ index 從 0 開始,第 1 大在 index 0,第 2 大在 index 1

pivot 由 STL 內部演算法自己選,實作可能依 compiler 不同;它不是每次一定同一個。快的原因不是「把每個元素搬到絕對位置」,而是做 partition:小量交換,把資料分左右;平均情況只需要處理大約一半、再一半,所以平均 O(n)。

「第 k 大所在的那一側」一開始可能還很多個,但每次 partition 後範圍會縮小:
100 個
→ 只看其中約 50 個
→ 約 25 個
→ 約 12 個
→ ...
→ 找到第 k 大

nums[k-1] 就是因為 index 從 0 開始。

  1. 不太像字典。字典 / Hash Map 是:已知 key → 很快找到 value。

這題:不知道「第 k 大是哪個值」,要先比較元素大小才能知道。

所以 Hash Map 不適合直接解「第 k 大」;它比較適合像 #347 那種「某個數字出現幾次」。

Hash Map雜湊表 計數、查某個值的出現、value→frequency;快用key找對應資料,平均查/更新 O(1)
Heap/Priority Queue堆積/優先佇列;找前k大or小、保留最重要的k個;不用全排,只維持需要的那小部分
Quickselect nth_element(快速選擇);找第k大、第k小,且只查一次;不排序全,只定位k位,平均 O(n)
7.
Hash Map → 誰出現幾次?
Heap → 要前 k 個
Quickselect / nth_element → 第 k 個


上一篇
Ground Truth 好好存放努力中嗚嗚 & 215
下一篇
排球打的好差 & 322
系列文
快樂演算法22
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

1
AndyAWD
iT邦新手 1 級 ‧ 2026-09-08 23:46:41

api 存好存滿,太幸福了吧

真的快樂:)

我要留言

立即登入留言