LeetCode in Python 215. Kth Largest Element in an Array (数组中的第k个最大元素)

本文介绍了如何使用快速查找(如快速排序的哨兵划分)来降低查找数组中第k个最大元素的时间复杂度,通过比较和递归实现,避免了完全排序数组的过程。
摘要由CSDN通过智能技术生成

数组中第k个最大元素,最简单的做法就是先给数组排序然后寻找倒数第k个最大元素,但为进一步降低算法的时间复杂度,可以采用快速查找的方法确定元素,即采用快速排序的“哨兵划分”和递归思想。

示例:

图1 输入输出示例图 

方法一:

排序后取元素

class Solution:
    def findKthLargest(self, nums, k):
        nums.sort()
        return nums[len(nums) - k]

方法二:

快速查找

class Solution:
    def findKthLargest(self, nums, k):
        def quickSelect(nums, k):
            small, equal, big = [], [], []
            pivot = random.choice(nums)
            for num in nums:
                if num < pivot:
                    small.append(num)
                elif num > pivot:
                    big.append(num)
                else:
                    equal.append(num)
            if k <= len(big):
                return quickSelect(big, k)
            elif k > len(nums) - len(small):
                return quickSelect(small, k + len(small) - len(nums))
            return pivot
        return quickSelect(nums, k)

解释:

1)pivot即为哨兵,将数组中>、<、=哨兵的元素存储到三个数组中,通过判断第k大元素落在哪个数组确定快速查找递归的下一个数组是谁。

2)着重注意对k的判断以及递归中的k值即可。

        if k <= len(big):

                return quickSelect(big, k)

        elif k > len(nums) - len(small):

                return quickSelect(small, k + len(small) - len(nums))

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值