news 2026/4/25 4:07:19

【中等】打印N个数组整体最大的TopK-Java

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【中等】打印N个数组整体最大的TopK-Java

分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请轻击人工智能教程大家好!欢迎来到我的网站! 人工智能被认为是一种拯救世界、终结世界的技术。毋庸置疑,人工智能时代就要来临了,科… 继续阅读 前言https://www.captainai.net/troubleshooter

package live.every.day.ProgrammingDesign.CodingInterviewGuide.ArrayAndMatrix; /** * 打印N个数组整体最大的TopK * * 【题目】 * 有N个长度不一的数组,所有的数组都是有序的,请从大到小打印这N个数组整体最大的前K个数。 * 例如,输入含有N行元素的二维数组可以代表N个一维数组。 * 219,405,538,845,971 * 148,558 * 52,99,348,691 * 再输入整数k=5,则打印: * Top5:971,845,691,558,538 * * 【要求】 * 1.如果所有数组的元素个数小于K,则从大到小打印所有的数。 * 2.要求时间复杂度为O(KlogN)。 * * 【难度】 * 中等 * * 【解答】 * 本题的解法是利用堆结构和堆排序的过程完成的,具体过程如下: * 1.构建一个大小为N的大根堆heap,建堆的过程就是把每一个数组中的最后一个值,也就是该数组的最大值,依次加入到堆里,这个过 * 程是建堆时的调整过程(heapInsert)。 * 2.建好堆之后,此时heap堆顶的元素是所有数组的最大值中最大的那个,打印堆顶元素。 * 3.假设堆顶元素来自a数组的i位置。那么接下来就把堆顶的前一个数(即a[i-1])放在heap的头部,也就是用a[i-1]替换原本的堆 * 顶,然后从堆的头部开始调整堆,使其重新变为大根堆(heapify过程)。 * 4.这样每次都可以得到一个堆顶元素max,在打印完成后都经历步骤3的调整过程。整体打印k次,就是从大到小全部的TopK。 * 5.在重复步骤3的过程中,如果max来自的那个数组(仍假设是a数组)已经没有元素。也就是说,max已经是a[0],再往左没有数了。 * 那么就把heap中最后一个元素放在heap头部的位置,然后把heap的大小减1(heapSize-1),最后依然是从堆的头部开始调整堆, * 使其重新变为大根堆(堆大小减1之后的heapify过程)。 * 6.直到打印了k个数,过程结束。 * * 为了知道每一次的max来自什么数组的什么位置,放在堆里的元素是如下的HeapNode类。 * * 整个打印过程请参看如下代码中的printTopK方法。 * * @author Created by LiveEveryDay */ public class PrintNArrayTopK { public static class HeapNode { public int value; // 值是什么 public int arrNum; // 来自哪个数组 public int index; // 来自数组的哪个位置 public HeapNode(int value, int arrNum, int index) { this.value = value; this.arrNum = arrNum; this.index = index; } } public static void printTopK(int[][] matrix, int topK) { int heapSize = matrix.length; HeapNode[] heap = new HeapNode[heapSize]; for (int i = 0; i != heapSize; i++) { int index = matrix[i].length - 1; heap[i] = new HeapNode(matrix[i][index], i, index); heapInsert(heap, i); } System.out.println("TOP " + topK + " : "); for (int i = 0; i != topK; i++) { if (heapSize == 0) { break; } System.out.print(heap[0].value + " "); if (heap[0].index != 0) { heap[0].value = matrix[heap[0].arrNum][--heap[0].index]; } else { swap(heap, 0, --heapSize); } heapify(heap, 0, heapSize); } } public static void heapInsert(HeapNode[] heap, int index) { while (index != 0) { int parent = (index - 1) >> 1; if (heap[parent].value < heap[index].value) { swap(heap, parent, index); index = parent; } else { break; } } } public static void heapify(HeapNode[] heap, int index, int heapSize) { int left = index * 2 + 1; int right = index * 2 + 2; int largest = index; while (left < heapSize) { if (heap[left].value > heap[index].value) { largest = left; } if (right < heapSize && heap[right].value > heap[largest].value) { largest = right; } if (largest != index) { swap(heap, largest, index); } else { break; } index = largest; left = index * 2 + 1; right = index * 2 + 2; } } public static void swap(HeapNode[] heap, int index1, int index2) { HeapNode tmp = heap[index1]; heap[index1] = heap[index2]; heap[index2] = tmp; } public static void main(String[] args) { int[] arr1 = {219, 405, 538, 845, 971}; int[] arr2 = {148, 558}; int[] arr3 = {52, 99, 348, 691}; int[][] matrix = new int[][]{arr1, arr2, arr3}; int topK = 5; printTopK(matrix, topK); } } // ------ Output ------ /* TOP 5 : 971 845 691 558 538 */
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/25 4:02:23

基石SQLGeniusAgent:AI驱动的数据库智能助手

**** 基石SQLGeniusAgent是基于Dify (基石智算) DeepSeek技术栈构建的AI数据库智能助手**** 测试和验证结果 测试流程截图&#xff1a;一、名称解析 基石 “基石” 代表基石智算&#xff0c;它是整个产品的坚实后盾。在如今数据爆炸的时代&#xff0c;企业级AI算力是高效处理…

作者头像 李华
网站建设 2026/4/25 3:58:16

Optuna超参数优化:提升机器学习模型调优效率

1. 超参数优化入门&#xff1a;为什么选择Optuna&#xff1f;在机器学习项目中&#xff0c;模型调优往往是最耗时的环节之一。传统网格搜索(Grid Search)和随机搜索(Random Search)虽然简单直接&#xff0c;但当参数空间较大时&#xff0c;这两种方法要么计算成本过高&#xff…

作者头像 李华
网站建设 2026/4/25 3:57:37

告别Switch游戏文件管理烦恼:NSC_BUILDER一站式解决方案

告别Switch游戏文件管理烦恼&#xff1a;NSC_BUILDER一站式解决方案 【免费下载链接】NSC_BUILDER Nintendo Switch Cleaner and Builder. A batchfile, python and html script based in hacbuild and Nuts python libraries. Designed initially to erase titlerights encryp…

作者头像 李华
网站建设 2026/4/25 3:57:14

ml-intern模型评估指标详解:提升你的模型质量

ml-intern模型评估指标详解&#xff1a;提升你的模型质量 【免费下载链接】ml-intern &#x1f917; ml-intern: an open-source ML engineer that reads papers, trains models, and ships ML models 项目地址: https://gitcode.com/GitHub_Trending/ml/ml-intern 在机…

作者头像 李华
网站建设 2026/4/25 3:57:08

昇思深度学习原理简介

昇思 MindSpore 是华为自主研发的全场景深度学习计算框架&#xff0c;以 “易开发、高效执行、全场景覆盖” 为核心设计目标&#xff0c;深度匹配昇腾 AI 处理器算力&#xff0c;支持端、边、云统一部署与协同训练。其核心原理围绕动静统一编程、源码转换式自动微分、全场景中间…

作者头像 李华