class Solution:
def findKthLargest(self, nums: List[int], k: int) -> int:
def _partion(nums,left,right):
rand_index = random.randint(left,right)#随机化切分元素
# randint 是包括左右区间的
nums[left],nums[rand_index] = nums[rand_index],nums[left]
pivot = nums[left]
j = left
for i in range(left,right+1):
if nums[i]<pivot:
j +=1 #理解点1
#绝大部分i==j,当i!=j时,此时中间一定有几个nums[i]>pivot,导致j没有更新;
#所以遇到了能更新的,一定要与之前的nums[i](大一点)的互换,即将小的放前面
nums[i],nums[j] = nums[j],nums[i]
nums[j],nums[left] = nums[left],nums[j]#理解点2
#j表示pivot最终应该在的位置,初始时pivot是从nums[left]
#开始,所以nums[left],nums[j]互换没问题,能理解
return j
left = 0
right = len(nums)-1
while left <= right:
index = _partion(nums,left,right)
if index == len(nums)-k:
return nums[index]
elif index < len(nums)-k:
left = index +1
else:
right = index -1
参考快速选择的文章
https://leetcode-cn.com/problems/kth-largest-element-in-an-array/solution/partitionfen-er-zhi-zhi-you-xian-dui-lie-java-dai-/
https://leetcode-cn.com/problems/kth-largest-element-in-an-array/solution/xiao-ding-dui-kuai-pai-fen-qu-by-elevenxx/