class Solution:
def findKthLargest(self, nums: List[int], k: int) -> int:
return self.quickSelect(nums,0,len(nums)-1,len(nums)-k)
def quickSelect(self,a,l,r,index):
# 数组a,左右区间l和r,找划分后索引index正好为倒数第k个
# 从列表中,随机初始化 pivot 为 q , 把q放到最后一个位置,快排列表
q = self.randomPartition(a,l,r)
# 判断当前分好的q是否在index处,即倒数第k个
if q == index:
return a[q]
else:
# 判断是否index比q大的话,就继续递归遍历右半部分,否则左半部分
return self.quickSelect(a,q+1,r,index) if q < index else self.quickSelect(a,l,q-1,index)
def randomPartition(self,a,l,r):
# 在这个[l,r] 中随机选一个索引出来
i = random.randint(l,r)
# 将pivot值交换到最后一个的位置
a[i],a[r] = a[r],a[i]
return self.partition(a,l,r)
def partition(self,a,l,r):
# pivot值
x = a[r]
# 记录最后一个比pivot小的值的索引
i = l-1
for j in range(l,r):
# 小于 pivot 的元素都被交换到前面
if a[j]<=x:
i+=1
a[i],a[j]=a[j],a[i]
# 交换pivot和第一个比pivot大的值(i+1)
a[r],a[i+1] = a[i+1],a[r]
# 此时的i+1就是最后的pivot的索引值
return i+1
每日一道Leetcode - 215. 数组中的第K个最大元素 【快速排序|快速选择】
最新推荐文章于 2022-04-20 09:58:48 发布