LeetCode 215 陣列中的第K個最大元素

2022-06-25 02:24:13 字數 2132 閱讀 4977

difficulty:中等

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

solution

快速排序解法一:在快速排序的partition過程中,可以確定的是切分點pivot的位置在最終的排序結果中不會變化,如果是降序排列,那麼切分點左邊的數都大於等於切分點位置的數,切分點右邊的數都小於等於切分點位置的數。題目要求給出陣列第k個最大的數,在降序排列的過程中,如果切分點剛好等於k-1,就能直接返回結果,如果切分點在k-1的左側則去切分點的左側[left,p-1]去尋找,否則去右側[p+1,right]

空間複雜度:o(1)

class solution:

def findkthlargest(self, nums: list[int], k: int) -> int:

if not nums or not k:

return none

left, right = 0, len(nums)-1

while 1:

p = self.partition(nums, left, right)

if p == k-1:

return nums[p]

elif p > k-1:

right = p - 1

else:

left = p + 1

def partition(self, arr, low, high):

i = low - 1

pivot = arr[high]

for j in range(low, high):

if arr[j] >= pivot:

i += 1

arr[i], arr[j] = arr[j], arr[i]

arr[i+1], arr[high] = arr[high], arr[i+1]

return i+1

快速排序解法二:直接應用快速排序將整個陣列排序,然後返回-k索引位置的數字

class solution:

def findkthlargest(self, nums: list[int], k: int) -> int:

if not nums or not k:

return none

left, right = 0, len(nums)-1

self.qsort(nums, left, right)

return nums[-k]

def qsort(self, arr, low, high):

if len(arr) <= 1:

return arr

if low < high:

p = self.partition(arr, low, high)

self.qsort(arr, low, p-1)

self.qsort(arr, p+1, high)

def partition(self, arr, low, high):

i = low - 1

pivot = arr[high]

for j in range(low, high):

if arr[j] <= pivot:

i += 1

arr[i], arr[j] = arr[j], arr[i]

arr[i+1], arr[high] = arr[high], arr[i+1]

return i+1

LeetCode 215 陣列中的第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...

LeetCode 215 陣列中的第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...

Leetcode215 陣列中的第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...