【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)。
🧠 算法思路
-
随机选一个
pivot
(基准元素) -
将数组划分为三部分:
big
:所有大于 pivot 的数equal
:所有等于 pivot 的数small
:所有小于 pivot 的数
-
判断第
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)(由于切片产生的新列表) |
🧠 优化建议
- 节省空间:可以用原地 partition(如 Lomuto 法)替代切片,避免生成新列表。
- 面试场景:如果面试官没要求 O(n),直接用排序即可快速出解。
- 重复元素处理:等于 pivot 的元素不能漏掉,需要单独统计。
📌 总结
- 快速选择是解决“第K大”、“第K小”类问题的利器
- 随机选择 pivot 是算法性能稳定的关键
- 递归思想+分治策略,让问题逐步缩小,最终得到答案
📁 推荐刷题练习
- LeetCode 215. 数组中的第K个最大元素(本文)
- LeetCode 347. 前 K 个高频元素(用堆)
- LeetCode 703. 数据流中的第 K 大元素(实时处理)
希望本文对你理解快速选择算法和递归有实质性的帮助!如果觉得有用,欢迎点赞、收藏、评论支持 🙌
相关文章:
【LeetCode 热题 100】215. 数组中的第K个最大元素(Python 快速选择详解)
在刷 LeetCode 的过程中,“第K大”是一个非常高频的考点,而题目 215. 数组中的第K个最大元素 就是经典代表。这道题不仅考察我们对排序的理解,还挑战我们写出时间复杂度为 O(n) 的算法。 本文将带你深入理解并实现一个基于快速选择ÿ…...

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

指针运算典型例题解析
1.题目1 该代码运行的结果是什么? #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; } 解析: 运行结果: 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 处理非结构化数据
作者:来自 Elastic Ajay Krishnan Gopalan 了解如何使用 NV-Ingest、Unstructured Platform 和 Elasticsearch 为 RAG 应用构建可扩展的非结构化文档数据管道。 Elasticsearch 原生集成了行业领先的生成式 AI 工具和提供商。查看我们的网络研讨会,了解如…...

20250508在WIN10下使用移远的4G模块EC200A-CN直接上网
1、在WIN10/11下安装驱动程序:Quectel_Windows_USB_DriverA_Customer_V1.1.13.zip 2、使用移远的专用串口工具:QCOM_V1.8.2.7z QCOM_V1.8.2_win64.exe 3、配置串口UART42/COM42【移远会自动生成连续三个串口,最小的那一个】 AT命令…...

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

NXP iMX8MP ARM 平台多屏幕克隆显示测试
By Toradex秦海 1). 简介 NXP i.MX8MP ARM SoC 支持 3 路 Display Controller 分别提供 DSI/HDMI/LVDS 显示输出,在 Yocto Linux BSP 下采用 Wayland Backend 基于 DRM subsystem 显示驱动,前端默认基于 Weston Compositor。因此在默认情况下连接多个屏…...
探秘 Canva AI 图像生成器:重塑设计创作新范式
Canva 凭借简洁易用的界面和海量模板资源,早已成为设计师和普通用户的心头好。而 Canva AI 图像生成器的推出,更是为设计领域带来了一场深刻变革,以智能化的手段重塑了图像创作的方式与边界。 技术内核:AI 如何驱动图像生成 Can…...

【数据结构】——栈
一、栈的概念和结构 栈其实就是一种特殊的顺序表,其只允许在一端进出,就是栈的数据的插入和删除只能在一端进行,进行数据的插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的元素遵循先进后出LIFO(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,会提示 解决办法 找到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 当前配置的镜像源,使用命令 conda config --show channels这将显示当前配置的通道(channels),即镜像源列表。 此外,还可以使用 conda config --show命令来显示conda的配置信息&…...

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

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

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

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

第7次课 栈A
课堂学习 栈(stack) 是一种遵循先入后出逻辑的线性数据结构。 我们可以将栈类比为桌面上的一摞盘子,如果想取出底部的盘子,则需要先将上面的盘子依次移走。我们将盘子替换为各种类型的元素(如整数、字符、对象等&…...
部署RocketMQ
部署环境:jdk8以上,Linux系统 下载和安装指令: wget https://archive.apache.org/dist/rocketmq/4.9.4/rocketmq-all-4.9.4-bin-release.zip 显示下载成功: --2025-05-10 11:34:46-- https://archive.apache.org/dist/rocketm…...

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

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

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

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

渗透测试行业术语1
渗透测试行业术语1 1. 肉鸡 所谓“肉鸡”是一种很形象的比喻,比喻那些可以随意被我们控制的电脑,对方可以是 WINDOWS 系统,也可以是 UNIX/LINUX 系统可以是普通的个人电脑,也可以是大型的服务器我们可以象操作自己的电脑那样来操…...
[思维模式-25]:《本质思考力》-6- 马哲的三大规律:对立统一规律、质量互变规律、否定之否定规律,以及在计算机领域中的体现
一、马克思主义哲学的三大规律 马克思主义哲学的三大规律是对立统一规律、质量互变规律、否定之否定规律,它们共同构成了唯物辩证法的核心内容,揭示了事物发展的根本动力、过程形式和方向特征。 以下是对这三大规律的详细阐述: 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 系统,从硬件搭建到安装 SAP、根据业务流程做配置、开发、培训业务、测试系统直到系统上线。 SAP S/4 HANA ACTIVATE 实施方法论…...

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