215. Kth Largest Element in an Array
題目網址:https://leetcode.cn/problems/kth-largest-element-in-an-array/
題意:給一 array
nums
和一整數k
, 返回第k
大的元素。注意:你需要找的是
nums
排序後的第k
大的元素, 而非第k
個不同的元素。設計滿足 $O(n)$ time 的演算法。
Solution 1:
想法:利用 Heap, 維護前
k
大的元素, 類似 347. Top K Frequent Elements
class Solution { |
- time:$O(n \cdot log(k))$ ➔ for loop 最多 insert/delete
n
個點, 每次操作需 $O(log(k))$, 因為pq
中最多k
個點 - space:$O(k)$ ➔
pq
的最大長度為k
Solution 2:
想法:利用 Quick Select, 原題目就會變成求將
nums
由小到大排序後idx = n - k
的元素, 因為排序完後idx = n - 1
為第一大的元素, 故idx = n - k
為第k
大的元素
- 先選一元素當作 pivot
- 把
val ≤ pivot
的元素放在 pivot 的左邊- 而
val > pivot
的元素放在 pivot 的右邊- 比較
pivot_idx
是否為k
- 若
k > pivot_idx
:遞迴搜索右邊的部分quickSelect(pivot_idx + 1, right)
- 若
k < pivot_idx
:遞迴搜索左邊的部分quickSelect(left, pivot_idx - 1)
- 若
k == pivot_idx
:返回nums[k]
e.g.
nums = [3,2,1,5,6,4]
,k = 2
➔k = n - k = 6 - 2 = 4
- 首先,
left = 0
,right = 5
, 取出pivotVal = 4
,pivotIdx = 0
,- 第一輪 Quick Select 做完, 得到
nums = [3,2,1,4,6,5]
,pivotIdx = 3
- 由於
k = 4 > pivotIdx = 3
, 故往右邊尋找quickSelect(nums, pivotIdx + 1, right, k)
- 第二輪 Quick Select 做完, 得到
nums = [3,2,1,4,5,6]
,pivotIdx = 4
k == pivotIdx
, 故返回nums[4] = 5
class Solution { |
- time:$O(n)$ ➔ Quick Select 的 Avg case
- worse case 為 $O(n^2)$, 也就是每次取完
pivot
都只篩掉一個元素
- worse case 為 $O(n^2)$, 也就是每次取完
- space:$O(1)$ ➔ 只需常數空間
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Zako's Blog!
評論