LeetCode-215. 数组中的第K个最大元素【数组 分治 快速选择 排序 堆(优先队列)】

LeetCode-215. 数组中的第K个最大元素【数组 分治 快速选择 排序 堆(优先队列)】

题目描述:

给定整数数组 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 <= k <= nums.length <= 105
-104 <= nums[i] <= 104

解题思路一:排序

使用编程语言的内置排序算法对数组 nums 进行排序,然后返回第 N−k 个元素即可。

class Solution:
    def findKthLargest(self, nums: List[int], k: int) -> int:
        return sorted(nums)[len(nums) - k]

时间复杂度:O(nlogn)
空间复杂度:O(logn)

解题思路二:快速选择

一种解决方案是使用「三路划分」,即每轮将数组划分为三个部分:小于、等于和大于基准数的所有元素。这样当发现第 k 大数字处在“等于基准数”的子数组中时,便可以直接返回该元素。

为了进一步提升算法的稳健性,我们采用随机选择的方式来选定基准数。

class Solution:
    def findKthLargest(self, nums, k):
        def quick_select(nums, k):
            # 随机选择基准数
            pivot = random.choice(nums)
            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 quick_select(big, k)
            if len(big) + len(equal) < k:
                # 第 k 大元素在 small 中,递归划分
                return quick_select(small, k - len(big) - len(equal))
            # 第 k 大元素在 equal 中,直接返回 pivot
            return pivot
        
        return quick_select(nums, k)

时间复杂度:O(n)
空间复杂度:O(logn)

解题思路三:0


时间复杂度:O(n)
空间复杂度:O(n)

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-09 19:14:01       91 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-09 19:14:01       97 阅读
  3. 在Django里面运行非项目文件

    2024-04-09 19:14:01       78 阅读
  4. Python语言-面向对象

    2024-04-09 19:14:01       88 阅读

热门阅读

  1. ChatGPT新手指南:如何用AI写出专业学术论文

    2024-04-09 19:14:01       34 阅读
  2. vue3 reactive包裹数组无法页面无法响应式

    2024-04-09 19:14:01       32 阅读
  3. 定制您的设备体验:如何更改Android启动动画

    2024-04-09 19:14:01       34 阅读
  4. 出海的网络挑战

    2024-04-09 19:14:01       36 阅读
  5. ALTER TABLE 之 慢速变更(slow alter)

    2024-04-09 19:14:01       38 阅读
  6. LeetCode 670. 最大交换

    2024-04-09 19:14:01       37 阅读
  7. memset()函数及其作用

    2024-04-09 19:14:01       36 阅读
  8. 蓝桥杯-【二分】求阶乘

    2024-04-09 19:14:01       38 阅读