此题与jz040有点相似,不过一个是输出前K小的所有数字,这个是只输出第K大的元素。这个算法的时间复杂度是O(N),空间复杂度因为是原地排序所以是O(1)。
import random
class Solution:
def findKthLargest(self, nums: List[int], k: int) -> int:
t = len(nums)-k
l, r = 0, len(nums)-1
while True:
index = self.qsort_rec(nums, l, r)
if index == t:
return nums[index]
elif index > t:
r = index - 1
else:
l = index + 1
def qsort_rec(self, lst, left, right):
random_index = random.randint(left, right)
lst[left], lst[random_index] = lst[random_index], lst[left]
# if left >= right:
# return
i, j = left, right
pivot = lst[i]
while i < j:
while i < j and lst[j] >= pivot:
j -= 1
lst[i] = lst[j]
while i < j and lst[i] <= pivot:
i += 1
lst[j] = lst[i]
lst[i] = pivot
return i
# self.qsort_rec(lst, left, i-1)
# self.qsort_rec(lst, i+1, right)
PREVIOUSjz068II.二叉树的最近公共祖先
NEXTmq001.最大子序和