陣列中的第k個最大元素

2021-09-25 22:21:34 字數 2541 閱讀 3411

在未排序的陣列中找到第 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(log⁡k)(\log k)o(logk),我們將重複該操作 n 次,故總時間複雜度為 o(nlog⁡k)(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...