当前位置: 首页 > 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

思路

找到数组中第K大的元素,我们最直观的思路,肯定是把数组排个序,然后取第K大的元素就好了,但是题目中要求,必须使用O(n)的时间复杂度处理,而一般内置的排序算法,是无法满足O(n)的,因此我们需要想别的办法。
说到O(n),说明题目是希望我们仅使用一次遍历就可以找到第N大的元素,一遍遍历就能找到第K大的元素,是不可能的事情,那么我们的思考方向,尽量往这个方向靠,尽可能少的遍历,找到第K大的元素。
我们可以借用二分的思想,只不过需要对二分做一些变种处理,在数组中随机选择一个数,我们就叫它中间数,然后进行分堆处理,比中间数大的,我们就将其放入大堆中,等于它的放入中间堆,小于它的放入小堆,然后判断第K大的数应该在哪一个堆中,在对其进行递归查找。

class Solution {private int findKthLargest(int[] nums, int k) {List<Integer> numList = new ArrayList<>();for (int num : nums) {numList.add(num);}return quickSelect(numList, k);}private int quickSelect(List<Integer> nums, int k) {// 随机选择基准数Random rand = new Random();int pivot = nums.get(rand.nextInt(nums.size()));// 将大于、小于、等于 pivot 的元素划分至 big, small, equal 中List<Integer> big = new ArrayList<>();List<Integer> equal = new ArrayList<>();List<Integer> small = new ArrayList<>();for (int num : nums) {if (num > pivot)big.add(num);else if (num < pivot)small.add(num);elseequal.add(num);}// 第 k 大元素在 big 中,递归划分if (k <= big.size())return quickSelect(big, k);// 第 k 大元素在 small 中,递归划分if (big.size() + equal.size() < k)return quickSelect(small, k - (big.size() + equal.size()));// 第 k 大元素在 equal 中,直接返回 pivotreturn pivot;}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 2021 hnust 湖科大 操作系统课设 报告+原代码+指导书+流程图源文件
  • 【初阶数据结构】深入解析顺序表:探索底层逻辑
  • Facebook开户|Facebook广告设计与测试优化
  • 假期已结束,大家都开始上班了吗
  • if 语句、布尔类型、关系表达式
  • Ktor库的高级用法:代理服务器与JSON处理
  • linux中sed命令和awk命令如何使用??????
  • k8s小型实验模拟
  • mac环境基于llama3和metaGPT自动开发2048游戏
  • HTML静态网页成品作业(HTML+CSS)—— 金宝贝儿童教育机构介绍网页(2个页面)
  • 箭头函数 this
  • 纷享销客安全体系:安全运维运营
  • mysqldump常用备份数据库命令
  • 开发自动发消息插件需要用到的源代码!
  • 5.3 数据模型设计总结
  • 分享的文章《人生如棋》
  • 【Leetcode】104. 二叉树的最大深度
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • chrome扩展demo1-小时钟
  • eclipse(luna)创建web工程
  • golang 发送GET和POST示例
  • iOS 颜色设置看我就够了
  • java小心机(3)| 浅析finalize()
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • Making An Indicator With Pure CSS
  • React Transition Group -- Transition 组件
  • SpiderData 2019年2月23日 DApp数据排行榜
  • sublime配置文件
  • vue学习系列(二)vue-cli
  • Wamp集成环境 添加PHP的新版本
  • 爱情 北京女病人
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 你真的知道 == 和 equals 的区别吗?
  • 如何设计一个比特币钱包服务
  • 世界上最简单的无等待算法(getAndIncrement)
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • 说说我为什么看好Spring Cloud Alibaba
  • ‌分布式计算技术与复杂算法优化:‌现代数据处理的基石
  • # C++之functional库用法整理
  • #Z0458. 树的中心2
  • #每天一道面试题# 什么是MySQL的回表查询
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (19)夹钳(用于送货)
  • (26)4.7 字符函数和字符串函数
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (差分)胡桃爱原石
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (十六)一篇文章学会Java的常用API
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • ***测试-HTTP方法
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始