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

发布于:2024-08-08 ⋅ 阅读:(109) ⋅ 点赞:(0)

题目描述

给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。

请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。

示例 1:

输入: [3,2,1,5,6,4], k = 2
输出: 5

示例 2:

输入: [3,2,3,1,2,4,5,5,6], k = 4
输出: 4

思路

1)先遍历数组,把比当前值小的值,放在small数组里;大的值,放在big里;等于的放在equal里

2)如果big数组的长度大于k,说明k在big里,递归big数组进行查找k

3)如果len(nums)-len(small)<k:说明k在small数组里,递归small数组,但k的值需替换为:k-[len(nums)-len(small)],需要去掉在big数组里的前几个,k需要更新下,更新到在small数组里的位置

4)如果正好等于当前基准值,则直接返回

class Solution(object):
    def quick_select(self, nums, k):
        # 随机选择基准数
        pivot = nums[-1]
        big, equal, small = [], [], []
        # 将大于、小于、等于 pivot 的元素划分至 big, small, equal 中
        for num in nums:
            if num > pivot:
                big.append(num)
            elif num < pivot:
                small.append(num)
            else:
                equal.append(num)
        if k <= len(big):
            # 第 k 大元素在 big 中,递归划分
            return self.quick_select(big, k)
        if len(nums) - len(small) < k:
            # 第 k 大元素在 small 中,递归划分
            return self.quick_select(small, k - len(nums) + len(small))
        # 第 k 大元素在 equal 中,直接返回 pivot
        return pivot

    def findKthLargest(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: int
        """
        return self.quick_select(nums, k)


if __name__ == '__main__':
    s = Solution()
    nums = [3,2,1,5,6,4]
    k = 2
    print(s.findKthLargest(nums, k))

网站公告

今日签到

点亮在社区的每一天
去签到