当前位置: 首页 > article >正文

【LeetCode 热题 100】215. 数组中的第K个最大元素(Python 快速选择详解)

在刷 LeetCode 的过程中,“第K大”是一个非常高频的考点,而题目 215. 数组中的第K个最大元素 就是经典代表。这道题不仅考察我们对排序的理解,还挑战我们写出时间复杂度为 O(n) 的算法。

本文将带你深入理解并实现一个基于快速选择(Quickselect)的高性能解法。


🧩 题目描述

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

⚠️ 注意:题目中要求是第 k 大,而不是第 k 个不同的元素。

示例

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

❗️暴力解法(不推荐)

最简单的方法就是对数组排序后取倒数第 k 个元素:

def findKthLargest(nums, k):nums.sort()return nums[-k]

虽然代码简洁,但排序的时间复杂度是 O(n log n),不符合题目期望的 O(n) 要求。


💡 正确姿势:快速选择算法(Quickselect)

📚 Quickselect 是什么?

快速选择是快速排序的“变种”,它利用了分治的思想,在每次划分时只处理可能包含答案的那一半,从而平均时间复杂度降为 O(n)。


🧠 算法思路

  1. 随机选一个 pivot(基准元素)

  2. 将数组划分为三部分:

    • big:所有大于 pivot 的数
    • equal:所有等于 pivot 的数
    • small:所有小于 pivot 的数
  3. 判断第 k 大数在哪个部分:

    • 如果在 big 中,递归查找 big 中的第 k
    • 如果在 equal 中,直接返回 pivot
    • 如果在 small 中,调整 k,递归查找 small 中的 (k - big数 - equal数)

✅ 完整 Python 实现

import randomclass Solution:def findKthLargest(self, nums, k):def quick_select(nums, k):pivot = random.choice(nums)big = [num for num in nums if num > pivot]small = [num for num in nums if num < pivot]equal_count = len(nums) - len(big) - len(small)if k <= len(big):return quick_select(big, k)elif k <= len(big) + equal_count:return pivotelse:return quick_select(small, k - len(big) - equal_count)return quick_select(nums, k)

🔍 递归是怎么用的?

  • 递归本质:自己调用自己,逐步缩小问题范围。
  • 每次我们都在更小的数组中递归地寻找第 k 大元素。
  • 有效缩小搜索空间,每次最多处理一半元素。

🎯 举个例子

nums = [3,2,1,5,6,4], k = 2 为例:

  • 首轮 pivot 可能是 3:

    • big = [5, 6, 4],长度为 3
  • 因为 2 ≤ 3,说明我们要找的第 2 大在 big

  • 递归进入 quick_select([5, 6, 4], 2)

  • 再选 pivot,比如是 5:

    • big = [6]equal = [5]small = [4]
  • 此时 2 落在 equal 区间,返回 5,找到答案!


⚙️ 时间 & 空间复杂度分析

项目分析
时间复杂度平均 O(n),最坏 O(n²)(极少发生)
空间复杂度O(n)(由于切片产生的新列表)

🧠 优化建议

  1. 节省空间:可以用原地 partition(如 Lomuto 法)替代切片,避免生成新列表。
  2. 面试场景:如果面试官没要求 O(n),直接用排序即可快速出解。
  3. 重复元素处理:等于 pivot 的元素不能漏掉,需要单独统计。

📌 总结

  • 快速选择是解决“第K大”、“第K小”类问题的利器
  • 随机选择 pivot 是算法性能稳定的关键
  • 递归思想+分治策略,让问题逐步缩小,最终得到答案

📁 推荐刷题练习

  • LeetCode 215. 数组中的第K个最大元素(本文)
  • LeetCode 347. 前 K 个高频元素(用堆)
  • LeetCode 703. 数据流中的第 K 大元素(实时处理)

希望本文对你理解快速选择算法和递归有实质性的帮助!如果觉得有用,欢迎点赞、收藏、评论支持 🙌

相关文章:

【LeetCode 热题 100】215. 数组中的第K个最大元素(Python 快速选择详解)

在刷 LeetCode 的过程中&#xff0c;“第K大”是一个非常高频的考点&#xff0c;而题目 215. 数组中的第K个最大元素 就是经典代表。这道题不仅考察我们对排序的理解&#xff0c;还挑战我们写出时间复杂度为 O(n) 的算法。 本文将带你深入理解并实现一个基于快速选择&#xff…...

麦科信获评CIAS2025金翎奖【半导体制造与封测领域优质供应商】

在苏州举办的2025CIAS动力能源与半导体创新发展大会上&#xff0c;深圳麦科信科技有限公司凭借在测试测量领域的技术积累&#xff0c;入选半导体制造与封测领域优质供应商榜单。本届大会以"新能源芯时代"为主题&#xff0c;汇集了来自功率半导体、第三代材料应用等领…...

指针运算典型例题解析

1.题目1 该代码运行的结果是什么&#xff1f; #include <stdio.h> int main() { int a[5] { 1, 2, 3, 4, 5 }; int *ptr (int *)(&a 1); printf( "%d,%d", *(a 1), *(ptr - 1)); return 0; } 解析&#xff1a; 运行结果&#xff1a; 2.题目2 在X86…...

DAX 权威指南1:DAX计算、表函数与计算上下文

参考《DAX 权威指南 第二版》 文章目录 二、DAX简介2.1 理解 DAX 计算2.2 计算列和度量值2.3 变量2.3.1 VAR简介2.3.2 VAR的特性 2.4 DAX 错误处理2.4.1 DAX 错误类型2.4.1.1 转换错误2.4.1.2 算术运算错误2.4.1.3 空值或 缺失值 2.4.2 使用IFERROR函数拦截错误2.4.2.1 安全地进…...

使用 NV‑Ingest、Unstructured 和 Elasticsearch 处理非结构化数据

作者&#xff1a;来自 Elastic Ajay Krishnan Gopalan 了解如何使用 NV-Ingest、Unstructured Platform 和 Elasticsearch 为 RAG 应用构建可扩展的非结构化文档数据管道。 Elasticsearch 原生集成了行业领先的生成式 AI 工具和提供商。查看我们的网络研讨会&#xff0c;了解如…...

20250508在WIN10下使用移远的4G模块EC200A-CN直接上网

1、在WIN10/11下安装驱动程序&#xff1a;Quectel_Windows_USB_DriverA_Customer_V1.1.13.zip 2、使用移远的专用串口工具&#xff1a;QCOM_V1.8.2.7z QCOM_V1.8.2_win64.exe 3、配置串口UART42/COM42【移远会自动生成连续三个串口&#xff0c;最小的那一个】 AT命令&#xf…...

C++(6):逻辑运算符

目录 1. 代码示例 示例 1&#xff1a;基础用法 示例 2&#xff1a;条件判断 2. 短路求值&#xff08;Short-Circuit Evaluation&#xff09; 代码示例 3. 实际应用场景 场景 1&#xff1a;输入合法性验证 场景 2&#xff1a;游戏状态判断 4. 注意事项 逻辑运算符用于组…...

NXP iMX8MP ARM 平台多屏幕克隆显示测试

By Toradex秦海 1). 简介 NXP i.MX8MP ARM SoC 支持 3 路 Display Controller 分别提供 DSI/HDMI/LVDS 显示输出&#xff0c;在 Yocto Linux BSP 下采用 Wayland Backend 基于 DRM subsystem 显示驱动&#xff0c;前端默认基于 Weston Compositor。因此在默认情况下连接多个屏…...

探秘 Canva AI 图像生成器:重塑设计创作新范式

Canva 凭借简洁易用的界面和海量模板资源&#xff0c;早已成为设计师和普通用户的心头好。而 Canva AI 图像生成器的推出&#xff0c;更是为设计领域带来了一场深刻变革&#xff0c;以智能化的手段重塑了图像创作的方式与边界。 技术内核&#xff1a;AI 如何驱动图像生成 Can…...

【数据结构】——栈

一、栈的概念和结构 栈其实就是一种特殊的顺序表&#xff0c;其只允许在一端进出&#xff0c;就是栈的数据的插入和删除只能在一端进行&#xff0c;进行数据的插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的元素遵循先进后出LIFO&#xff08;Last InFirst O…...

Navicat中保存的数据库密码找回 Java 8

导出数据库连接打开导出的connections.ncx文件找到加密的password放入java程序中解密即可 package com.asia.card.cloud.enterprise.api;import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.nio.cha…...

构件是一个逻辑概念,还是一个物理概念?

在软件架构中,​​构件(Component)​​既可以是逻辑概念,也可以是物理概念,具体取决于上下文和系统设计的需求。以下是两种视角的详细分析: ​​1. 逻辑概念(抽象层面)​​ ​​定义​​:构件是系统功能的逻辑划分,表示一组相关的职责或行为,不直接对应物理实现。 ​…...

vs code管理员权限启动问题

vs code非管理员启动可以正常启动用管理员启动vs code&#xff0c;会提示 解决办法 找到argv.json文件在argv.json文件中添加 "disable-chromium-sandbox": true重启vs code即可...

Spring Cloud与Service Mesh集成:Istio服务网格实践

文章目录 引言一、Spring Cloud与Service Mesh概述二、Istio服务网格架构三、Spring Cloud与Istio集成的基础设施准备四、服务发现与负载均衡五、流量管理与弹性模式六、安全通信与认证授权七、可观测性集成八、配置管理集成总结 引言 微服务架构已成为现代分布式系统的主流设…...

20250510-查看 Anaconda 配置的镜像源

打开 Anaconda Prompt 查看 Anaconda 当前配置的镜像源&#xff0c;使用命令 conda config --show channels这将显示当前配置的通道&#xff08;channels&#xff09;&#xff0c;即镜像源列表。 此外&#xff0c;还可以使用 conda config --show命令来显示conda的配置信息&…...

React+Taro选择日期组件封装

话不多说&#xff0c;直接上效果 1.页面渲染时间模块 {this.renderCalendarPopup()}2.引入时间组件弹层&#xff0c;state中加入showPopup(控制什么时候展示时间选择弹层)&#xff0c;time(选择后的时间值) private renderCalendarPopup () > {const { showPopup, time…...

C++进阶--AVL树的实现续

文章目录 C进阶--AVL树的实现双旋AVL树的查找AVL树的检验结语 很高兴和搭大家见面&#xff0c;给生活加点impetus&#xff0c;开启今天的比编程之路&#xff01;&#xff01; 今天我们来完善AVL树的操作&#xff0c;为后续红黑树奠定基础&#xff01;&#xff01; 作者&#x…...

AutoGen+Deepseek+chainlit的简单使用

AutoGen 的应用场景 AutoGen 作为一个强大的多智能体协作框架&#xff0c;可用于多种复杂任务&#xff1a; 自动化工作流&#xff1a;构建由多个智能体组成的流水线&#xff0c;例如数据收集、分析、报告生成复杂问题分解&#xff1a;将难题拆解为子任务&#xff0c;分配给不…...

采用SqlSugarClient创建数据库实例引发的异步调用问题

基于SqlSugar编写的多个WebApi接口&#xff0c;项目初始化时采用单例模式注册SqlSugarClient实例对象&#xff0c;前端页面采用layui布局&#xff0c;并在一个按钮事件中通过Ajax连续调用多个WebApi接口获取数据。实际运行时点击按钮会随机报下面几种错误&#xff1a; Execute…...

第7次课 栈A

课堂学习 栈&#xff08;stack&#xff09; 是一种遵循先入后出逻辑的线性数据结构。 我们可以将栈类比为桌面上的一摞盘子&#xff0c;如果想取出底部的盘子&#xff0c;则需要先将上面的盘子依次移走。我们将盘子替换为各种类型的元素&#xff08;如整数、字符、对象等&…...

部署RocketMQ

部署环境&#xff1a;jdk8以上&#xff0c;Linux系统 下载和安装指令&#xff1a; wget https://archive.apache.org/dist/rocketmq/4.9.4/rocketmq-all-4.9.4-bin-release.zip 显示下载成功&#xff1a; --2025-05-10 11:34:46-- https://archive.apache.org/dist/rocketm…...

软考-软件设计师中级备考 13、刷题 数据结构

倒计时17天时间不多了&#xff0c;数据库、UML、等知识点有基础直接略过&#xff0c;法律全靠考前的一两天刷题&#xff0c;英语直接放弃。 一、数据结构&#xff1a;链表、栈、队列、数组、哈希表、树、图 1、关于链表操作&#xff0c;说法正确的是&#xff1a; A)新增一个头…...

centos的根目录占了大量空间怎么办

问题 当根目录磁盘不够时&#xff0c;就必须删除无用的文件了 上面的&#xff0c;如果删除/usr 或/var是可以释放出系统盘的 定位占空间大的文件 经过命令&#xff0c;一层层查哪些是占磁盘的。 du -sh /* | sort -rh | head -n 10 最终排查&#xff0c;是有个系统日志占了20…...

电子电器架构 --- 新能源高压上下电那点事一文通

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…...

每日算法-250510

每日算法学习记录 - 250510 1. LeetCode 2086. 喂食仓鼠的最小食物桶数 题目描述: 解题思路 这是一个典型的贪心问题。我们的目标是用最少的食物桶喂饱所有仓鼠。 解题过程 核心思想是&#xff1a;当遇到一只仓鼠时&#xff0c;如何放置食物桶才能最有效地利用这个桶。 …...

渗透测试行业术语1

渗透测试行业术语1 1. 肉鸡 所谓“肉鸡”是一种很形象的比喻&#xff0c;比喻那些可以随意被我们控制的电脑&#xff0c;对方可以是 WINDOWS 系统&#xff0c;也可以是 UNIX/LINUX 系统可以是普通的个人电脑&#xff0c;也可以是大型的服务器我们可以象操作自己的电脑那样来操…...

[思维模式-25]:《本质思考力》-6- 马哲的三大规律:对立统一规律、质量互变规律、否定之否定规律,以及在计算机领域中的体现

一、马克思主义哲学的三大规律 马克思主义哲学的三大规律是对立统一规律、质量互变规律、否定之否定规律&#xff0c;它们共同构成了唯物辩证法的核心内容&#xff0c;揭示了事物发展的根本动力、过程形式和方向特征。 以下是对这三大规律的详细阐述&#xff1a; 1、对立统一…...

Ubuntu22.04安装显卡驱动/卸载显卡驱动

报错 今日输入nvidia-smi报错,在安装了535和550,包括560都没办法解决,但是又怕乱搞导致环境损坏,打算把显卡卸载然后重新安装系统默认推荐版本的显卡驱动 qinqin:~$ nvidia-smi Failed to initialize NVML: Driver/library version mismatch NVML library version: 560.35卸载…...

不同类型的 SAP 项目

目录 1 实施项目 2 SAP S/4 HANA 升级项目 3 数据迁移项目 4 优化项目 5 Rollout 项目 6 运维项目 1 实施项目 企业第一次用 SAP 系统&#xff0c;从硬件搭建到安装 SAP、根据业务流程做配置、开发、培训业务、测试系统直到系统上线。 SAP S/4 HANA ACTIVATE 实施方法论…...

【大模型】使用 LLaMA-Factory 进行大模型微调:从入门到精通

使用 LLaMA-Factory 进行模型微调&#xff1a;从入门到精通 一、环境搭建&#xff1a;奠定微调基础&#xff08;一&#xff09;安装依赖工具&#xff08;二&#xff09;创建 conda 环境&#xff08;三&#xff09;克隆仓库并安装依赖 二、数据准备&#xff1a;微调的基石&#…...