215. 数组中的第K个最大元素

215. 数组中的第K个最大元素

一般来说,直接sort排序,取对应位置元素即可。
但是做算法题不能这样取巧。
但是解题思路是一样的:排序+取值

使用快速排序的方法:
1.初始化一个哨兵元素,遍历所有元素,分为大于该元素,等于该元素,小于该元素的,放在三个数组中
2.检查k是小于等于big的长度,如果是,说明在big数组中,继续递归
3.检查k是否大于big+equal的长度,如果是,说明在small数组中;并且由于已经不在big+equal中了,所以要排除掉前big+equal长度的k,因此要更新k
4.最终返回哨兵元素

class Solution:
    def findKthLargest(self, nums: List[int], k: int) -> int:
        # 快速排序
        def qs(nums, k):
            # 哨兵元素,随机选择
            pivot = random.choice(nums)
            # 初始化比哨兵元素大、等、小的数组
            big, equal, small = [], [], []
            # 遍历数组,将元素归类
            for num in nums:
                if num > pivot:
                    big.append(num)
                elif num < pivot:
                    small.append(num)
                else:
                    equal.append(num)
            # 要求是第k大,我们按哨兵元素分,大的都在Big这,
            # 所以如果说k小于big的长度,那肯定就在big里面
            # 继续在里面递归找
            if k <= len(big):
                return qs(big, k)
            # 如果k比Big和相等的数组长度大,那就是在小于的数组里面
            # k的大小也应该自减
            if k > len(big) + len(equal):
                return qs(small, k-len(big)-len(equal))
            # 找到满足的哨兵元素
            return pivot
        return qs(nums,k)
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

灵海之森

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值