215 数组中的第k个最大元素,重新学习记录快速选择

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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值