打印N个数组整体最大的TopK
题目:
有N个长度不一的数组,所有的数组都是有序的,请从大到小打印这个N个数组整体最大的前K个数。
例如,输入含有N行元素的二维数组可以代表N个一维数组。
219, 405, 538, 845, 971
148, 558
52, 99, 348, 691
再输入整数k = 5,则打印:
971, 845, 691, 558, 538
要求:
如果所有数组的元素个数小于K,则从大到小打印所有的数
要求时间复杂度为O(KlogN)
基本思路:
本题的解法是利用堆结构和堆排序的过程完成的,具体过程如下:
构建一个大小为N的大根堆,建堆的过程就是把每一个数组的最后一个值,也就是该数组的最大值,依次加入到堆里,这个过程就是建堆的调整过程。
建好堆以后,此时堆顶的元素就是所有数组中最大的元素,打印堆顶元素。
假设堆顶的元素来自 a 数组的 i 位置,那么将堆顶的元素用a[i-1]替换,然后从堆的头部重新调整堆。如果发现此时 a 数组已经没有元素,那么就将堆顶元素与堆尾元素交换,同时令堆的大小减1,仍然是从堆的头部重新调整堆。
每次都可得到一个堆顶元素,打印k个堆顶元素,就是最终的结果。
class Heap:def __init__(self,value,arrNum,index):self.value = valueself.arrNum = arrNumself.index = indexdef printTopk(matrix,k):if matrix == None or len(matrix) == 0:return NoneheapSize = len(matrix)heap = [0 for i in range(heapSize)]for i in range(len(heap)):heap[i] = Heap(matrix[i][index],i,len(heap[i])-1)heapInsert(heap,i)print("Tok " + str(k) + " : ")for i in range(k):if heapSize == 0:breakprint(heap[0].value + " ")if heap[0].index!=0:heap[0].value = matrix[heap[0].arrNum][heap[0].index-1]heap[0].index -=1else:heap[0] = heap[-1]heapSize -= 1heapify(heap,0,heapSize)def heapInsert(heap,index):while parent!=0:parent = int((index-1)/2)if heap[index].value > heap[parent].value:swap(heap,index,parent)index = parentelse:breakdef heapify(heap,index,heapSize):left = 2 * index +1right = 2 * index + 2largest = indexwhile left < heapSize:if heap[left].value > heap[largest].value:largest = leftif right < heapSize and heap[right].value > heap[largest].value:largest = rightif largest != index:swap(heap,largest,index)else:breakindex = largestleft = 2 * index + 1right = 2 * index + 2def swap(heap,index1,index2):tmp = heap[index1]heap[index1] = heap[index2]heap[index2] = tmp
打印N个数组整体最大的TopK相关推荐
- 【C 语言】数组 ( 验证二维数组内存是线性的 | 打印二维数组 | 以一维数组方式打印二维数组 | 打印二维数组值和地址 )
文章目录 一.验证二维数组内存是线性的 1.打印二维数组 2.以一维数组方式打印二维数组 3.打印二维数组值和地址 二.完整代码示例 一.验证二维数组内存是线性的 验证二维数组内存是线性的 : 验证方 ...
- ios字典存bool_#iOS 打印中文字典,数组,控制台输出中文,并保持缩进格式
为了方便调试我们经常需要在控制台打印数组/字典信息,但是如果含有中文,打印出来的就是一堆看不懂的信息(其实是Unicode编码),影响开发效率. 本文目标: 使用NSLog能打印中文字典/数组 在控制 ...
- c#读取整数空格_C ++程序声明,读取和打印动态整数数组
c#读取整数空格 Prerequisite: new and delete operator in C++ 先决条件: C ++中的new和delete运算符 Here, we will learn ...
- js-练习题-循环打印二维数组-二维数组求和-个人所得税
循环打印二维数组 <script>var arr=new Array();for(i=0;i<5;i++){arr[i]=new Array();for(j=0;j<8;j++ ...
- 打印二维数组的三种方法
方法一:常规法 老老实实传二维数组. void print1(int arr[3][5], int row, int col) {int i = 0;int j = 0;for (i = 0; i & ...
- java打印二维数组_Java中如何打印二维数组
在Java中如何打印二维数组 1.直接使用数组自带的toString------ 打印出数组的地址 2.使用Arrays.toString()---------- 打印每个二维数组的地址 3.使用Ar ...
- 顺时针打印二维数组C语言递归,按顺时针打印矩阵
存在二种解题思路: 一种是递归解法,一种是层层递进解法 图解递归解法 如图所示, 一个5*5的矩阵 先打印最外层的圈, 然后剩余最里层3*3的矩阵, 如图. 将3*3的矩阵继续打印最外层,思路与打印最 ...
- 洛谷1527(bzoj2738)矩阵乘法——二维树状数组+整体二分
题目:https://www.luogu.org/problemnew/show/P1527 不难想到(?)可以用二维树状数组.但维护什么?怎么查询是难点. 因为求第k小,可以考虑记权值树状数组,把比 ...
- Java中Arrays.toString ()打印二维数组及Array数组的常用操作
1.Java中Arrays.toString () 已知打印一维数组的API为System.out.println ( Arrays.toString ();,其参数为数组名或数组指针,其支持的数据类 ...
最新文章
- 华为mate x2什么时候更新鸿蒙系统,华为Mate X2真机发布,今年四月可升级鸿蒙系统...
- 13、Excutors 结合 ThreadFactory 自动给线程加上线程名
- 黑马 程序员——Java基础---流程控制
- 模拟退火算法SA参数设置实验记录
- json字符串与对象如何相互转换
- python编写接口初识一
- Spring中的自动装配和Autowired
- Maven仓库理解、如何引入本地包、Maven多种方式打可执行jar包
- Python中的AES加解密算法
- word里面用mathtype编辑公式转成PDF后出现乱码
- 动态分配IP之dhcp服务
- 「45课时热泵仿真」Excel热泵系统热力计算与仿真全课程
- 能耗分项计量监测系统在某大型公建中的应用
- Java 发送消息模版内容换行(包含微信,企业微信)
- 大型网站架构演变史(含技术栈与价值观)
- iOS开发笔记 -- 动态切换APP的logo
- Python学习之路:函数传递可变参数与不可变参数
- 【Go】Go Ubuntu 安装 gvm:Go 版本管理工具
- 常量的定义与使用与变量的定义与使用
- Java用普里姆算法(prim)解决修路最短路径问题
热门文章
- vs2010 问题 LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
- 【STSRM13】绵津见
- 七牛云音视频新功能:音频支持AAC_HE
- CI框架 -- CLI执行php代码
- C#如何控制方法的执行时间,超时则强制退出方法执行
- nginx+keepalived双master负载均衡配置
- lwip协议栈中超时定时器实现原理
- PAT甲级1097 Deduplication on a Linked List:[C++题解]遍历链表、两个vector
- 数据结构_栈和队列的区别
- mysql 多表查询实例讲解_mysql多表连接查询实例讲解