Java 找出数组中最大的 k 个元素(Find k largest elements in an array)

发布时间:2026/8/20 22:09:41

Java 找出数组中最大的 k 个元素(Find k largest elements in an array)
如果您喜欢此文章请收藏、点赞、评论谢谢祝您快乐每一天。给定一个数组arr[]和一个整数k任务是找出给定数组中最大的 k 个元素。输出数组中的元素应按降序排列。例如输入[1, 23, 12, 9, 30, 2, 50]k 3输出[ 50, 30, 23]输入[11, 5, 12, 9, 44, 17, 2]k 2输出[ 44, 17]【朴素方法】使用排序其思路是将输入数组按降序排列使数组中的前k 个元素成为最大的k 个元素。// Java program to find k largest elements in an array using// sortingimport java.util.*;class GfG {static ArrayListInteger kLargest(int[] arr, int k) {int n arr.length;// Convert int type to Integer// for sorting with a comparatorInteger[] arrInteger Arrays.stream(arr).boxed().toArray(Integer[]::new);// Sort the array in descending orderArrays.sort(arrInteger, Collections.reverseOrder());// Store the first k elements in result listArrayListInteger res new ArrayList();for (int i 0; i k; i)res.add(arrInteger[i]);return res;}public static void main(String[] args) {int[] arr {1, 23, 12, 9, 30, 2, 50};int k 3;ArrayListInteger res kLargest(arr, k);for (int ele : res)System.out.print(ele );}}输出50 30 23时间复杂度O(n * log n)辅助空间O(1)【预期方法】使用优先级队列最小堆其思路是在遍历数组的过程中每一步都记录下最大的 k 个元素。为此我们使用最小堆。首先将初始的 k 个元素插入最小堆。之后对于每个后续元素我们将其与堆顶元素进行比较。由于最小堆的堆顶元素是这 k 个元素中最小的如果当前元素大于堆顶元素则意味着堆顶元素不再是最大的 k 个元素之一。在这种情况下我们移除堆顶元素并插入更大的元素。完成整个遍历后堆将恰好包含数组中最大的 k 个元素。// Java program to find the k largest elements in the// array using min heapimport java.util.*;class GfG {// Function to find the k largest elements in the arraystatic ArrayListInteger kLargest(int[] arr, int k) {// Min-heap to store the k largest elementsPriorityQueueInteger minHeap new PriorityQueue(k);// Add first k elements to the heapfor (int i 0; i k; i) {minHeap.add(arr[i]);}// Traverse the rest of the arrayfor (int i k; i arr.length; i) {// If current element is larger than// the smallest in heapif (arr[i] minHeap.peek()) {minHeap.poll();minHeap.add(arr[i]);}}// Extract elements from the heapArrayListInteger res new ArrayList();while (!minHeap.isEmpty()) {res.add(minHeap.poll());}// Reverse the list for descending orderCollections.reverse(res);return res;}public static void main(String[] args) {int[] arr {1, 23, 12, 9, 30, 2, 50};int k 3;ArrayListInteger res kLargest(arr, k);for (int ele : res) {System.out.print(ele );}}}输出50 30 23时间复杂度O(n * log k)由于构建堆需要线性时间因此该方案可在 O(k (nk) Log K) 时间完成。辅助空间O(k)注意JavaScript 原生实现似乎不支持最小堆因此建议使用快速选择实现。【替代方法】使用快速选择算法其思路是利用快速排序的分区步骤在不重新排序整个数组的情况下找到数组中最大的 k 个元素。c 快速排序c 快速排序QuickSort_快速排序c代码-CSDN博客c语言 快速排序c语言 快速排序QuickSort_分区操作选择最后一个元素作为基准 c语言-CSDN博客python 快速排序Python 快速排序QuickSort_python实现快速排序-CSDN博客c# 快速排序C# 快速排序QuickSort-CSDN博客java 快速排序java 快速排序QuickSort_quicksort java-CSDN博客PHP 快速排序PHP 快速排序QuickSort-CSDN博客JavaScript快速排序JavaScript 快速排序QuickSort-CSDN博客在按降序对元素进行排序时分区步骤会重新排列元素将所有大于或等于选定基准元素通常是最后一个元素的元素放在基准元素的左侧将所有小于基准元素的元素放在基准元素的右侧并将基准元素置于其正确的排序位置。每次分区后我们将数组左侧部分包含所有大于或等于基准元素的元素的元素个数与 k进行比较左侧元素个数 k这意味着左侧部分的所有元素包括枢轴元素都是最大的 k 个元素。左侧元素个数 k这意味着最大的 k 个元素只存在于左侧子数组中因此我们在左侧子数组中递归搜索。左侧元素个数小于 k这意味着最大的 k 个元素包含了数组左侧的全部元素以及右侧的部分元素。因此我们将 k 减去左侧已覆盖的元素个数然后在右侧子数组中搜索。// Java program to find the k largest elements in the array// using partitioning step of quick sortimport java.util.*;class GfG {// Function to partition the array around a pivotstatic int partition(int[] arr, int left, int right) {// Last element is chosen as a pivot.int pivot arr[right];int i left;for (int j left; j right; j) {// Elements greater than or equal to pivot// are placed in the left side of pivotif (arr[j] pivot) {int temp arr[i];arr[i] arr[j];arr[j] temp;i;}}int temp arr[i];arr[i] arr[right];arr[right] temp;// The correct sorted position of the pivotreturn i;}static void quickSelect(int[] arr, int left, int right, int k) {if (left right) {int pivotIdx partition(arr, left, right);// Count of all elements in the left partint leftCnt pivotIdx - left 1;// If leftCnt is equal to k, then we have// found the k largest elementif (leftCnt k)return;// Search in the left subarrayif (leftCnt k)quickSelect(arr, left, pivotIdx - 1, k);// Reduce the k by number of elements already covered// and search in the right subarrayelsequickSelect(arr, pivotIdx 1, right, k - leftCnt);}}static ArrayListInteger kLargest(int[] arr, int k) {quickSelect(arr, 0, arr.length - 1, k);ArrayListInteger res new ArrayList();// First k elements of the array, will be the largestfor(int i 0; i k; i)res.add(arr[i]);// Sort the result in descending orderCollections.sort(res, Collections.reverseOrder());return res;}public static void main(String[] args) {int[] arr {1, 23, 12, 9, 30, 2, 50};int k 3;ArrayListInteger res kLargest(arr, k);for (int ele : res)System.out.print(ele );}}输出50 30 23时间复杂度最坏情况下为O(n² )平均情况下为 O(n)。辅助空间O(n)如果您喜欢此文章请收藏、点赞、评论谢谢祝您快乐每一天。

相关新闻

免费格式转换工具怎么选,2026这这5款更实用

免费格式转换工具怎么选,2026这这5款更实用

2026/8/20 22:09:41

做视频、搞办公,最怕遇到的“拦路虎”就是格式不兼容。视频打不开、PDF改不了、图片太大发不出去……这些问题在2026年虽然技术已经很成熟,但好用的工具依然难找。很多软件打着“免费”的旗号,要么限制次数,要么加水印&#xff0c…

【完整源码+数据集+部署教程】月球陨石坑检测系统源码 [一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]

【完整源码+数据集+部署教程】月球陨石坑检测系统源码 [一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]

2026/8/20 22:09:41

背景意义 随着人类对月球探索的深入,月球表面的特征和变化成为了科学研究的重要内容。月球陨石坑的形成与演化不仅能够揭示月球的地质历史,还为理解太阳系其他天体的演化提供了重要线索。陨石坑的数量、分布及其形态特征是研究月球表面环境和历史的重要…

【优化求解】基于收敛因子和黄金正弦指引机制的蝴蝶优化算法求解单目标优化问题matlab代码(AGSABOA)

【优化求解】基于收敛因子和黄金正弦指引机制的蝴蝶优化算法求解单目标优化问题matlab代码(AGSABOA)

2026/8/20 22:09:41

1 简介针对蝴蝶优化算法(butterfly optimization algorithm,BOA)中存在的局部开采和全局探索能力不均衡,易陷入局部最优值,收敛精度低等缺陷,提出收敛因子和黄金正弦指引机制的蝴蝶优化算法(convergence factor and gold sinusoidal guidance mechanism of butterfly optimizat…

从1只到30只:PKHeX-Plugins 把宝可梦数据合法化与批量生成变成几次点击

从1只到30只:PKHeX-Plugins 把宝可梦数据合法化与批量生成变成几次点击

2026/8/20 23:09:44

从1只到30只:PKHeX-Plugins 把宝可梦数据合法化与批量生成变成几次点击 【免费下载链接】PKHeX-Plugins Plugins for PKHeX 项目地址: https://gitcode.com/gh_mirrors/pk/PKHeX-Plugins 如果你也曾在深夜对着宝可梦编辑器里那一排"红色感叹号"束手…

思源宋体CN全套7字重TTF免费商用:一次克隆,让中文排版告别字重焦虑

思源宋体CN全套7字重TTF免费商用:一次克隆,让中文排版告别字重焦虑

2026/8/20 23:09:44

思源宋体CN全套7字重TTF免费商用:一次克隆,让中文排版告别字重焦虑 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 做设计这些年,我越来越觉得&…

Windows系统文件usoapi.dll丢失找不到问题解决

Windows系统文件usoapi.dll丢失找不到问题解决

2026/8/20 23:09:44

在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…

基于智能体强化学习的多阶段事实核查:从黑盒判决到可解释过程

基于智能体强化学习的多阶段事实核查:从黑盒判决到可解释过程

2026/8/20 23:09:44

1. 项目概述:从“判决”到“过程”的范式转变 最近在跟进信息可信度评估的前沿方向,发现一个挺有意思的转变。传统的“事实核查”模型,无论是基于自然语言推理(NLI)还是检索增强生成(RAG)&#…

Windows系统文件UserMgrProxy.dll丢失找不到问题解决

Windows系统文件UserMgrProxy.dll丢失找不到问题解决

2026/8/20 23:09:44

在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…

LRU算法的Java实现,基于LinkedHashMap

LRU算法的Java实现,基于LinkedHashMap

2026/8/20 22:59:44

LRU算法中文名称叫做:最近最少使用。 比如在Redis的定期淘汰策略中是其一方式,原理就是当有一些数据,最近最少被使用的数据优先淘汰。 实现方式有很多,基于LinkedHashMap是最简单的一种,LinkedHashMap 本身维护了一个双…

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

2026/8/19 3:36:59

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

【双层规划,节点出清价,绿证交易,CVaR方法】两级电力市场环境下计及风险的省间交易商最优购电模型附Matlab代码

【双层规划,节点出清价,绿证交易,CVaR方法】两级电力市场环境下计及风险的省间交易商最优购电模型附Matlab代码

2026/8/20 21:07:35

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

隐式mpc+自适应mpc+时变mpc,线性时变模型预测控制附Simulink仿真

隐式mpc+自适应mpc+时变mpc,线性时变模型预测控制附Simulink仿真

2026/8/19 8:02:16

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

微信聊天记录如何完整导出?WeChatMsg备份指南:HTML/Word/CSV一键转换

微信聊天记录如何完整导出?WeChatMsg备份指南:HTML/Word/CSV一键转换

2026/8/20 0:08:45

微信聊天记录如何完整导出?WeChatMsg备份指南:HTML/Word/CSV一键转换 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com…

B站缓存m4s打不开?m4s-converter无损合成MP4,实测1.46GB仅5秒

B站缓存m4s打不开?m4s-converter无损合成MP4,实测1.46GB仅5秒

2026/8/20 0:08:45

B站缓存m4s打不开?m4s-converter无损合成MP4,实测1.46GB仅5秒 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 判断你是否…

告别白模时代:Blender3mfFormat 让 3MF 导入导出一次跑通设计到打印

告别白模时代:Blender3mfFormat 让 3MF 导入导出一次跑通设计到打印

2026/8/20 0:08:45

告别白模时代:Blender3mfFormat 让 3MF 导入导出一次跑通设计到打印 【免费下载链接】Blender3mfFormat Blender add-on to import/export 3MF files 项目地址: https://gitcode.com/gh_mirrors/bl/Blender3mfFormat 按 3MF 官方规范的字面意思,一…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/17 12:00:53

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/15 10:10:27

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/18 12:20:24

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…