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

【算法】数组中的第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

解题思路:

要找到数组中第k个最大的元素,且要求时间复杂度为O(n),我们可以使用快速选择算法,这是一种基于快速排序的选择算法变种,用于找到未排序数组中的第k个元素,而无需完全排序数组。

  1. 选择基准:从数组中随机选择一个元素作为基准元素,或者选择数组的第一个元素、最后一个元素等作为基准。
  2. 分区操作:将数组分为两部分,一部分包含所有不大于基准的元素,另一部分包含所有大于基准的元素。这个操作结束后,基准元素会处于它在排序后数组中的最终位置。同时,我们也会得到基准元素在排序后数组中的索引。
  3. 根据基准索引判断
  • 如果基准元素的索引正好是k-1,那么基准元素就是我们要找的第k大的元素。
  • 如果基准元素的索引小于k-1,说明第k大的元素在基准的右边,我们在基准的右边数组中继续执行前两步。
  • 如果基准元素的索引大于k-1,说明第k大的元素在基准的左边,我们在基准的左边数组中继续执行前两步。
  1. 递归或迭代:重复上述过程,直到找到第k大的元素。

JavaScript实现:

function findKthLargest(nums, k) {function partition(left, right, pivotIndex) {const pivotValue = nums[pivotIndex];// 将基准元素交换到数组末尾[nums[pivotIndex], nums[right]] = [nums[right], nums[pivotIndex]];let storeIndex = left;for (let i = left; i < right; i++) {if (nums[i] > pivotValue) {[nums[storeIndex], nums[i]] = [nums[i], nums[storeIndex]];storeIndex++;}}// 将基准元素放到正确的位置[nums[right], nums[storeIndex]] = [nums[storeIndex], nums[right]];return storeIndex;}function quickSelect(left, right, kSmallest) {if (left === right) return nums[left];let pivotIndex = Math.floor(Math.random() * (right - left + 1)) + left;pivotIndex = partition(left, right, pivotIndex);if (kSmallest === pivotIndex) {return nums[kSmallest];} else if (kSmallest < pivotIndex) {return quickSelect(left, pivotIndex - 1, kSmallest);} else {return quickSelect(pivotIndex + 1, right, kSmallest);}}// 调整k为基于0的索引return quickSelect(0, nums.length - 1, nums.length - k);
}// 示例
console.log(findKthLargest([3,2,1,5,6,4], 2)); // 输出: 5,因为排序后数组为[1,2,3,4,5,6],第2大的元素是5

这段代码首先定义了partition函数来实现分区操作,然后定义了quickSelect函数来递归地执行快速选择算法。最后,findKthLargest函数调用quickSelect来找到数组中第k大的元素。注意,由于我们是从0开始计数,所以在调用quickSelect时传入的是nums.length - k。

相关文章:

【算法】数组中的第K个最大元素

难度&#xff1a;中等 题目&#xff1a; 给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。 请注意&#xff0c;你需要找的是数组排序后的第 k 个最大的元素&#xff0c;而不是第 k 个不同的元素。 你必须设计并实现时间复杂度为 O(n) 的算法解决此问题…...

Perl 语言的特点

Perl 语言入门学习可以涵盖多个方面&#xff0c;包括其特点、基本语法、高级特性以及学习资源和社区支持等。以下是一个详细的入门学习指南&#xff1a; 一、Perl 语言的特点 文本处理能力强&#xff1a;Perl 提供了丰富的字符串处理函数和正则表达式的支持&#xff0c;非常适…...

NLP教程:1 词袋模型和TFIDF模型

文章目录 词袋模型TF-IDF模型词汇表模型 词袋模型 文本特征提取有两个非常重要的模型&#xff1a; 词集模型&#xff1a;单词构成的集合&#xff0c;集合自然每个元素都只有一个&#xff0c;也即词集中的每个单词都只有一个。 词袋模型&#xff1a;在词集的基础上如果一个单词…...

【开源 Mac 工具推荐之 2】洛雪音乐(lx-music-desktop):免费良心的音乐平台

旧版文章&#xff1a;【macOS免费软件推荐】第6期&#xff1a;洛雪音乐 Note&#xff1a;本文在旧版文章的基础上&#xff0c;新更新展示了一些洛雪音乐的新功能&#xff0c;并且描述更为详细。 简介 洛雪音乐&#xff08;GitHub 名&#xff1a;lx-music-desktop &#xff09;…...

AMEYA360:思瑞浦推出汽车级理想二极管ORing控制器TPS65R01Q

聚焦高性能模拟芯片和嵌入式处理器的半导体供应商思瑞浦3PEAK(股票代码&#xff1a;688536)发布汽车级理想二极管ORing控制器TPS65R01Q。 TPS65R01Q拥有20mV正向调节功能&#xff0c;降低系统损耗。快速反向关断(Typ&#xff1a;0.39μs)&#xff0c;在电池反向和各种汽车电气瞬…...

简约的悬浮动态特效404单页源HTML码

源码介绍 简约的悬浮动态特效404单页源HTML码,页面简约美观,可以做网站错误页或者丢失页面,将下面的代码放到空白的HTML里面,然后上传到服务器里面,设置好重定向即可 效果预览 完整源码 <!DOCTYPE html> <html><head><meta charset="utf-8&q…...

Golang 创建 Excel 文件

经常会遇到需要导出数据报表的需求&#xff0c;除了可以通过 encoding/csv 导出 CSV 以外&#xff0c;还可以使用 https://github.com/qax-os/excelize 导出 xlsx 等格式的 excel&#xff0c;下面封装了一个方法&#xff0c;支持多 sheet 的 excel 数据生成&#xff0c;导出按需…...

探索GitHub上的两个革命性开源项目

在数字世界中&#xff0c;总有一些项目能够以其创新性和实用性脱颖而出&#xff0c;吸引全球开发者的目光。今天&#xff0c;我们将深入探索GitHub上的两个令人惊叹的开源项目&#xff1a;Comic Translate和GPTPDF&#xff0c;它们不仅改变了我们处理信息的方式&#xff0c;还极…...

SpringBoot框架学习笔记(三):Lombok 和 Spring Initailizr

1 Lombok 1.1 Lombok 介绍 &#xff08;1&#xff09;Lombok 作用 简化JavaBean开发&#xff0c;可以使用Lombok的注解让代码更加简洁Java项目中&#xff0c;很多没有技术含量又必须存在的代码&#xff1a;POJO的getter/setter/toString&#xff1b;异常处理&#xff1b;I/O…...

【ASP.NET网站传值问题】“object”不包含“GetEnumerator”的公共定义,因此 foreach 语句不能作用于“object”类型的变量等

问题一&#xff1a;不允许遍历 原因&#xff1a;实体未强制转化 后端: ViewData["CateGroupList"] grouplist; 前端加上&#xff1a;var catelist ViewData["CateGroupList"] as List<Catelogue>; 这样就可以遍历catelist了 问题二&#xff1a…...

Stateflow中的状态转换表

状态转换表是表达顺序模态逻辑的另一种方式。不要在Stateflow图表中以图形方式绘制状态和转换&#xff0c;而是使用状态转换表以表格格式表示模态逻辑。 使用状态转换表的好处包括&#xff1a; 易于对类列车状态机进行建模&#xff0c;其中模态逻辑涉及从一个状态到其邻居的转换…...

结合Redis解决接口幂等性问题

结合Redis解决接口幂等性问题 引言正文收获 引言 该问题产生背景是根据需求描述&#xff0c;要求对已发布的课程能进行编辑修改&#xff0c;并且要求能进行回滚。 幂等性问题描述&#xff1a;对同一个接口并发请求产生的结果是不变的。 Get 请求以及 Delete 请求天然保证幂等…...

2024算力基础设施安全架构设计与思考(免费下载)

算网安全体系是将数据中心集群、算力枢纽、一体化大数据中心三个层级的安全需求进行工程化解耦&#xff0c;从国家安全角度统筹设计&#xff0c;通过安全 服务化方式&#xff0c;依托威胁情报和指挥协同通道将三层四级安全体系串联贯通&#xff0c;达成一体化大数据安全目标。 …...

ExoPlayer架构详解与源码分析(15)——Renderer

系列文章目录 ExoPlayer架构详解与源码分析&#xff08;1&#xff09;——前言 ExoPlayer架构详解与源码分析&#xff08;2&#xff09;——Player ExoPlayer架构详解与源码分析&#xff08;3&#xff09;——Timeline ExoPlayer架构详解与源码分析&#xff08;4&#xff09;—…...

网络安全-等级保护制度介绍

一、等保发展历程 &#xff08;1&#xff09;1994国务院147号令 第一次提出等级保护概念&#xff0c;要求对信息系统分等级进行保护 &#xff08;2&#xff09;1999年GB17859 国家强制标准发布&#xff0c;信息系统等级保护必须遵循的法规 &#xff08;3&#xff09;2005年公安…...

【介绍下大数据组件之Storm】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…...

React Hook 总结(React 萌新升级打怪中...)

1 useCallback useMemo 和 useCallback 接收的参数都是一样&#xff0c;都是在其依赖项发生变化后才执行&#xff0c;都是返回缓存的值&#xff0c;区别在于 useMemo 返回的是函数运行的结果&#xff0c;useCallback 返回的是函数。 当需要使用 useCallback 的情况通常包括以…...

Typora 1.5.8 版本安装下载教程 (轻量级 Markdown 编辑器),图文步骤详解,免费领取

文章目录 软件介绍软件下载安装步骤激活步骤 软件介绍 Typora是一款基于Markdown语法的轻量级文本编辑器&#xff0c;它的主要目标是为用户提供一个简洁、高效的写作环境。以下是Typora的一些主要特点和功能&#xff1a; 实时预览&#xff1a;Typora支持实时预览功能&#xff0…...

mac docker no space left on device

mac 上 docker 拉取镜像报错 Error response from daemon: write /var/lib/docker/tmp/docker-export-3995807640/b8464f52498789c4ebbc063d508f04e8d2586567fbffa475e3cd9afd3c5a7cf2/layer.tar: no space left on device解决&#xff1a; 增加 docker 虚拟磁盘大小。如下图...

单片机主控的基本电路

论文 1.复位电路 2.启动模式设置接口 3.VBAT供电接口 4.MCU 基本电路 5.参考电压选择端口...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

Linux简单的操作

ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

WebRTC从入门到实践 - 零基础教程

WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC&#xff1f; WebRTC&#xff08;Web Real-Time Communication&#xff09;是一个支持网页浏览器进行实时语音…...

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制

目录 节点的功能承载层&#xff08;GATT/Adv&#xff09;局限性&#xff1a; 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能&#xff0c;如 Configuration …...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准

城市路内停车管理常因行道树遮挡、高位设备盲区等问题&#xff0c;导致车牌识别率低、逃费率高&#xff0c;传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法&#xff0c;正成为破局关键。该设备安装于车位侧方0.5-0.7米高度&#xff0c;直接规避树枝遮…...

AxureRP-Pro-Beta-Setup_114413.exe (6.0.0.2887)

Name&#xff1a;3ddown Serial&#xff1a;FiCGEezgdGoYILo8U/2MFyCWj0jZoJc/sziRRj2/ENvtEq7w1RH97k5MWctqVHA 注册用户名&#xff1a;Axure 序列号&#xff1a;8t3Yk/zu4cX601/seX6wBZgYRVj/lkC2PICCdO4sFKCCLx8mcCnccoylVb40lP...