leetcode hot100 215. 数组中的第K个最大元素 medium 堆 快速选择 pivot分区


找第K大元素

暴力解法:排序后取第K个

时间复杂度:O(nlog⁡n)O(n \log n)O(nlogn),取决于排序算法(如快排、归并排序)

空间复杂度:O(1)O(1)O(1) 或 O(n)O(n)O(n),取决于排序实现

python 复制代码
class Solution:
    def findKthLargest(self, nums: List[int], k: int) -> int:
        nums.sort() # 暴力排序
        print(nums)   # 从小到大
        return nums[-k]

快速选择(Quick Select)算法

平均时间复杂度:O(n)

  1. 每次划分大约把数组分成两半,递归只进入一边。
  2. 平均递归深度约为 log n,但每层只处理部分数组,所以平均时间复杂度是 O(n)。

最坏情况:O(n²)(但可通过随机化 pivot 避免)

空间复杂度:O(1)(原地修改数组)

class中自己调自己,用self.

python 复制代码
class Solution:
    def findKthLargest(self, nums: List[int], k: int) -> int:

        # 快速选择(数组在无序状态下,每次抛一半: O(n))(二分法是有序状态下每次抛一半 O(log n))

        # 1. 随机选择一个分组参考值
        center = nums[-1]

        # 2. 分成3个部分
        left = [x for x in nums if x > center]  # 值大于center的
        mid  = [x for x in nums if x == center]  # 值 = center的
        right  = [x for x in nums if x < center]  # 值 < center的

        # 3. 判断 第k大 所在部分
        if k <= len(left):   # 值大于center的个数,超过k个,说明k在左边
            return self.findKthLargest(left,k)  # class中自己调自己,用self.
        elif k <= len(left)+ len(mid): # 第k大的值就=center值,而且可能还有好几个相同值
            return center
        else:  # 在右边
            return self.findKthLargest(right, k-len(left)-len(mid))
相关推荐
8Qi87 小时前
LeetCode 213:打家劫舍 II(House Robber II)—— 题解 ✅
算法·leetcode·职场和发展·动态规划
Lsk_Smion8 小时前
力扣实训 _ [75].颜色分类 _ 杨辉三角
数据结构·算法·leetcode
8Qi810 小时前
LeetCode 1049:最后一块石头的重量 II —— 题解 ✅
算法·leetcode·职场和发展·动态规划·01背包
运筹vivo@13 小时前
LeetCode 2574. 左右元素和的差值
算法·leetcode·职场和发展·每日一题
一只齐刘海的猫14 小时前
【Leetcode】移动零
算法·leetcode·职场和发展
人道领域14 小时前
【LeetCode刷题日记】131.分割回文串,动态规划优化
java·开发语言·leetcode
Lsk_Smion16 小时前
力扣实训 _ [994].腐烂的橘子/图论
算法·leetcode·图论
8Qi817 小时前
LeetCode 337:打家劫舍 III(House Robber III)—— 题解 ✅
算法·leetcode·二叉树·动态规划
2601_9611940217 小时前
教资科三美术考什么|初中高中美术题型考点和模板资料
leetcode·elasticsearch·职场和发展·蓝桥杯·pat考试·lucene
8Qi818 小时前
LeetCode 121 & 122:股票买卖问题(DP 对比题解)✅
算法·leetcode·职场和发展·动态规划