news 2026/6/11 8:52:42

【 每天学习一点算法 2026/03/23】数组中的第K个最大元素

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【 每天学习一点算法 2026/03/23】数组中的第K个最大元素

每天学习一点算法 2026/03/23

题目:数组中的第K个最大元素

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

请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。

  1. 最简单的方法就是先排序然后取第 k - 1 个元素

    functionfindKthLargest(nums:number[],k:number):number{returnnums.sort((a,b)=>b-a)[k-1]};
  2. 上面的方法取决于排序算法的时间复杂度肯定不是我们想要的,我们可以利用快速排序方法来解决这个问题

    快速排序的关键在于选取一个基准值,然后将 大于 和 小于 基准值数放在两个数组中,然后在递归传递这两个数组,继续选取基准值分割,直到完成排序。

    • 假如 基准值 左边元素个数小于 k - 1,那么需要在右边的数组中寻找新的基准值
    • 假如 基准值 左边元素个数大于 k - 1,那么需要在左边的数组中寻找新的基准值
    • 假如 基准值 左边刚好有 k - 1 元素,那么这个基准值就是第 k 大的元素
    functionfindKthLargest(nums:number[],k:number):number{if(nums.length===1)returnnums[0];// 只有一项直接返回constbase=nums[Math.floor(Math.random()*nums.length)];// 随机基准值constleft:number[]=[]constright:number[]=[]constequal:number[]=[]// 利用基准值分割数组for(constitemofnums){if(item<base){right.push(item)}elseif(item>base){left.push(item)}else{equal.push(item)}}if(left.length===k-1){// 值大于 base 的值刚好有 k - 1 个,那么 base 就是第 k 大的元素returnbase}elseif(left.length>k-1){// 值大于 base 的值大于 k - 1 个, 那么第 k 大的元素在 left 内returnfindKthLargest(left,k)}else{// 值大于 base 的值小于 k - 1 个if(left.length+equal.length>=k){// 值在 equal 内直接返回 basereturnbase}else{// 值在 right 内(k 值记得要减去 equal 的长度)returnfindKthLargest(right,k-left.length-equal.length)}}};
  3. 因为题目中数字有边界-10000 <= nums[i] <= 10000,所以我们可以利用计数排序的方法来寻找。

    functionfindKthLargest(nums:number[],k:number):number{constarr=newArray(20001).fill(0)// 用于统计数字频率constoffset=10000// 因为有负数我们添加一个偏移量for(letnumofnums){// 将数字转换成arr数字的下标,对应元素表示出现频次arr[num+offset]++}for(leti=20001;i>=0;i--){// 遍历 arr 数组if(arr[i]>0){// 如果遇到出现的数字,就用 k 减去出现的频次k-=arr[i]}if(k<=0){// k 小于等 0 表示这就是第 k 大的数字returni-offset}}};

题目来源:力扣(LeetCode)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/18 22:46:04

告别低效繁琐!千笔ai写作,毕业论文全流程神器

你是否曾为论文选题发愁&#xff0c;反复修改却总对表达不满意&#xff1f;是否在深夜面对空白文档无从下笔&#xff0c;又担心查重率过高&#xff1f;论文写作的每一步都充满挑战&#xff0c;从开题到定稿&#xff0c;每一个环节都可能成为压垮你的最后一根稻草。如果你正在经…

作者头像 李华
网站建设 2026/5/18 22:46:04

DCT-Net模型生成作品版权问题解析

DCT-Net模型生成作品版权问题解析 1. 引言 随着AI生成内容的普及&#xff0c;DCT-Net这类人像卡通化模型让普通用户也能轻松创作出专业级的二次元形象。但随之而来的版权问题却让很多人感到困惑&#xff1a;用AI生成的作品到底属于谁&#xff1f;能不能商用&#xff1f;会不会…

作者头像 李华
网站建设 2026/5/18 22:46:06

CoPaw模型成本优化全攻略:GPU算力精细管理与竞价实例策略

CoPaw模型成本优化全攻略&#xff1a;GPU算力精细管理与竞价实例策略 1. 为什么需要关注CoPaw模型的运行成本&#xff1f; 当你第一次部署CoPaw模型时&#xff0c;可能会被它的性能惊艳到。但随着使用深入&#xff0c;账单上的数字也开始变得醒目。很多开发者都经历过这样的心…

作者头像 李华
网站建设 2026/5/18 22:46:06

Python爬虫实战:突破百度安全验证的3种高效策略

1. 初识百度安全验证&#xff1a;为什么你的爬虫被拦截了 第一次用Python爬百度时看到<title>百度安全验证</title>这个页面&#xff0c;相信很多新手都会懵。我当初也踩过这个坑——明明代码能正常返回网页内容&#xff0c;突然就跳转到验证页面了。这其实是百度最…

作者头像 李华
网站建设 2026/5/18 22:46:22

图像分割实战 | 基于U2Net的智能抠图与背景替换,从零到一完整指南

1. 为什么选择U2Net进行智能抠图 第一次接触图像分割任务时&#xff0c;我被传统方法繁琐的参数调整折磨得够呛。直到遇到U2Net&#xff0c;这个专为显著性物体检测设计的深度学习模型&#xff0c;才真正体会到什么叫"智能抠图"。相比需要手动标注的PS工具&#xff0…

作者头像 李华
网站建设 2026/5/18 22:46:21

M2LOrder模型在内网穿透服务配置中的辅助决策指南

M2LOrder模型在内网穿透服务配置中的辅助决策指南 1. 引言 你有没有遇到过这样的开发场景&#xff1f;本地调试一个Web服务&#xff0c;想让外网的同事或者客户临时访问一下&#xff0c;结果发现没有公网IP&#xff0c;服务“锁”在了内网里出不去。或者&#xff0c;团队需要…

作者头像 李华