每日一道Leetcode - 215. 数组中的第K个最大元素 【快速排序|快速选择】

在这里插入图片描述

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值