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

时间:2024-04-19 19:42:17

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)

相关文章