在未排序的陣列中找到第 k 個最大的元素。請注意,你需要找的是陣列排序後的第 k 個最大的元素,而不是第 k 個不同的元素。
示例 1:
輸入: [3,2,1,5,6,4] 和 k = 2
輸出: 5
示例 2:
輸入: [3,2,3,1,2,4,5,5,6] 和 k = 4
輸出: 4
說明:你可以假設 k 總是有效的,且 1 ≤ k ≤ 陣列的長度。
方法一 堆
思路是建立乙個大頂堆,將所有陣列中的元素加入堆中,並保持堆的大小小於等於 k。這樣,堆中就保留了前 k 個最大的元素。這樣,堆頂的元素就是正確答案。
像大小為 k 的堆中新增元素的時間複雜度為 o(logk)(\log k)o(logk),我們將重複該操作 n 次,故總時間複雜度為 o(nlogk)(n \log k)o(nlogk)。
在 python 的 heapq 庫中有乙個 nlargest 方法,具有同樣的時間複雜度,能將**簡化到只有一行。
本方法優化了時間複雜度,但需要 o(k)(k)o(k) 的空間複雜度。
class solution:
def findkthlargest(self, nums, k):
""":type nums: list[int]
:type k: int
:rtype: int
"""return heapq.nlargest(k, nums)[-1]
**方法二:排序**
在輸出的陣列,樞軸到達其合適的位置,所有小於它的元素放在左側,大於它的元素大於放在左側。
隨機選擇乙個樞軸。
使用劃分演算法將樞軸放在陣列中的合適位置 pos。將小於樞軸的元素移到左邊,大於等於樞軸的元素移到右邊。
比較 pos 和 n - k 以決定在哪邊繼續遞迴處理。
class solution:
def findkthlargest(self, nums, k):
""":type nums: list[int]
:type k: int
:rtype: int
"""def partition(left, right, pivot_index):
pivot = nums[pivot_index]
# 1. move pivot to end
nums[pivot_index], nums[right] = nums[right], nums[pivot_index]
# 2. move all smaller elements to the left
store_index = left
for i in range(left, right):
if nums[i] < pivot:
nums[store_index], nums[i] = nums[i], nums[store_index]
store_index += 1
# 3. move pivot to its final place
nums[right], nums[store_index] = nums[store_index], nums[right]
return store_index
def select(left, right, k_smallest):
"""returns the k-th smallest element of list within left..right
"""if left == right: # if the list contains only one element,
return nums[left] # return that element
# select a random pivot_index between
pivot_index = random.randint(left, right)
# find the pivot position in a sorted list
pivot_index = partition(left, right, pivot_index)
# the pivot is in its final sorted position
if k_smallest == pivot_index:
return nums[k_smallest]
# go left
elif k_smallest < pivot_index:
return select(left, pivot_index - 1, k_smallest)
# go right
else:
return select(pivot_index + 1, right, k_smallest)
# kth largest is (n - k)th smallest
return select(0, len(nums) - 1, len(nums) - k)
陣列中的第K個最大元素
題目 在未排序的陣列中找到第 k 個最大的元素。請注意,你需要找的是陣列排序後的第 k 個最大的元素,而不是第 k 個不同的元素。法一 排序後輸出。法二 優先佇列 堆 法三 利用快速排序的方法。在這裡僅介紹法三,法一法二呼叫庫函式即可。思路 首先,找第k個最大的元素,即是找第n k 1個最小的元素。...
陣列中的第K個最大元素
在未排序的陣列中找到第 k 個最大的元素。請注意,你需要找的是陣列排序後的第 k 個最大的元素,而不是第 k 個不同的元素。示例 1 輸入 3,2,1,5,6,4 和 k 2 輸出 5 示例 2 輸入 3,2,3,1,2,4,5,5,6 和 k 4 輸出 4 說明 你可以假設 k 總是有效的,且 1...
陣列中的第K個最大元素
題目 在未排序的陣列中找到第 k 個最大的元素。請注意,你需要找的是陣列排序後的第 k 個最大的元素,而不是第 k 個不同的元素。示例 1 輸入 3 2,1 5,6 4 和 k 2輸出 5示例2 輸入 3 2,3 1,2 4,5 5,6 和 k 4輸出 4說明 你可以假設 k 總是有效的,且 1 k...