classSolution:deffindKthLargest(self, nums: List[int], k:int)->int:defquick(start, end, k):if start > end:return-1# import random
random_index = random.randint(start, end)
nums[random_index], nums[start]= nums[start], nums[random_index]
pivot = nums[end]
l = start
for i inrange(start, end):if nums[i]< pivot:
nums[i], nums[l]= nums[l], nums[i]
l +=1
nums[l], nums[end]= nums[end], nums[l]if l == k:return nums[l]elif l < k:return quick(l+1, end, k)else:return quick(start, l-1, k)####################################################### TopKreturn quick(0,len(nums)-1,len(nums)-k)# quick为最小k,topk则需用长度减掉k####################################################### MinKreturn quick(0,len(nums)-1, k-1)
堆排
classSolution:deffindKthLargest(self, nums, k:int)->int:defbuildHeap(heap):for i inrange(len(heap)//2,-1,-1):
heapify(heap, i)defheapify(arr, i):
length =len(arr)
left, right, largest =2* i +1,2* i +2, i
if left < length and arr[left]< arr[largest]:
largest = left
if right < length and arr[right]< arr[largest]:
largest = right
if largest != i:
arr[i], arr[largest]= arr[largest], arr[i]
heapify(arr, largest)####################################################### TopK:小小小顶堆
heap = nums[:k]
buildHeap(heap)for i inrange(k,len(nums)):# 若当前元素 > 堆顶元素,则调整堆if nums[i]> heap[0]:
heap[0]= nums[i]
heapify(heap,0)# 这里只需调整堆顶return heap[0]####################################################### MinK:大大大顶堆
heap =[-num for num in nums[:k]]
buildHeap(heap)for i inrange(k,len(nums)):# 若当前元素取反 > 堆顶元素,则调整堆if-nums[i]> heap[0]:
heap[0]=-nums[i]# 取反入堆!
heapify(heap,0)# 这里只需调整堆顶return-heap[0]