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 = 4k == 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!
評論