快排思想之陣列中的第K個最大元素

2021-10-08 12:45:35 字數 1632 閱讀 2209

在未排序的陣列中找到第 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

class

solution

(object):

deffindkthlargest

(self, nums, k)

:"""

:type nums: list[int]

:type k: int

:rtype: int

"""# return sorted(nums)[-k]

# return heapq.nlargest(k,nums)[-1]

heap =

for num in nums:

iflen

(heap)

else

:if num>heap[0]

: heapreplace(heap, num)

return heap[

0]

快速排序從大到小,只關心pivot的索引和k的大小

class

solution

:def

findkthlargest

(self, nums: list[

int]

, k:

int)

->

int:

left =

0 right =

len(nums)-1

while

true

: idx = self.partation(nums, left, right)

if idx == k -1:

# 注意索引從0開始

return nums[idx]

if idx < k -1:

left = idx +

1if idx > k -1:

right = idx -

1def

partation

(self, nums, left, right)

: pivot = nums[right]

flag = left -

1for i in

range

(left, right)

:if nums[i]

>= pivot:

# 注意此處是從大到小的快排,大的放前面,小的放後面

flag +=

1 nums[flag]

, nums[i]

= nums[i]

, nums[flag]

nums[flag +1]

, nums[right]

= nums[right]

, nums[flag +1]

return flag +

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 個不同的元素。法一 排序後輸出。法二 優先佇列 堆 法三 利用快速排序的方法。在這裡僅介紹法三,法一法二呼叫庫函式即可。思路 首先,找第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...