215. Kth Largest Element in an Array

215. Kth Largest Element in an Array

快速选择算法,和快排是同一个作者。

  • 选择一个轴点,将比其大的放在前面,比其小的放在后面,则中轴点为第 index + 1 小;
  • 判断 index 和 k 的关系,从而决定在前半段寻找第 k 大还是后半段;
  • 细节见代码
class Solution(object):
    def findKthLargest(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: int
        """
        if len(nums) == 0:
            return None
        elif len(nums) == 1:
            return nums[0]
        piovt = 0
        i = 0 # 从 0 开始 而不是 1
        j = len(nums) - 1
        num = nums[:]
        while i < j:
            # 因为最后要交换 pivot 和 最终 i/j 的位置,所以
            # 必须保证 i/j 的停止点元素是大于 pivot 的,所以
            # 应先 j 后 i
            while i < j and num[j] <= num[piovt]:
                j -= 1
            while i < j and num[i] >= num[piovt]:
                i += 1
            t = num[i]
            num[i] = num[j]
            num[j] = t 
        t = num[i]
        num[i] = num[piovt]
        num[piovt] = t
        piovt = i
        # 递归判断,注意 pivot + 1 和 k 进行比较
        # 另外 list[0:2] 是 [l[0], l[1]],不包括 l[2]
        # 同时 l[0:-1] 不包括最后一个元素
        if piovt + 1 == k:
            return num[piovt]
        elif piovt + 1 > k:
            return self.findKthLargest(num[0:piovt], k)
        else:
            return self.findKthLargest(num[piovt+1:], k-piovt-1)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值