题目:

  有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相关推荐

  1. 【C 语言】数组 ( 验证二维数组内存是线性的 | 打印二维数组 | 以一维数组方式打印二维数组 | 打印二维数组值和地址 )

    文章目录 一.验证二维数组内存是线性的 1.打印二维数组 2.以一维数组方式打印二维数组 3.打印二维数组值和地址 二.完整代码示例 一.验证二维数组内存是线性的 验证二维数组内存是线性的 : 验证方 ...

  2. ios字典存bool_#iOS 打印中文字典,数组,控制台输出中文,并保持缩进格式

    为了方便调试我们经常需要在控制台打印数组/字典信息,但是如果含有中文,打印出来的就是一堆看不懂的信息(其实是Unicode编码),影响开发效率. 本文目标: 使用NSLog能打印中文字典/数组 在控制 ...

  3. c#读取整数空格_C ++程序声明,读取和打印动态整数数组

    c#读取整数空格 Prerequisite: new and delete operator in C++ 先决条件: C ++中的new和delete运算符 Here, we will learn ...

  4. js-练习题-循环打印二维数组-二维数组求和-个人所得税

    循环打印二维数组 <script>var arr=new Array();for(i=0;i<5;i++){arr[i]=new Array();for(j=0;j<8;j++ ...

  5. 打印二维数组的三种方法

    方法一:常规法 老老实实传二维数组. void print1(int arr[3][5], int row, int col) {int i = 0;int j = 0;for (i = 0; i & ...

  6. java打印二维数组_Java中如何打印二维数组

    在Java中如何打印二维数组 1.直接使用数组自带的toString------ 打印出数组的地址 2.使用Arrays.toString()---------- 打印每个二维数组的地址 3.使用Ar ...

  7. 顺时针打印二维数组C语言递归,按顺时针打印矩阵

    存在二种解题思路: 一种是递归解法,一种是层层递进解法 图解递归解法 如图所示, 一个5*5的矩阵 先打印最外层的圈, 然后剩余最里层3*3的矩阵, 如图. 将3*3的矩阵继续打印最外层,思路与打印最 ...

  8. 洛谷1527(bzoj2738)矩阵乘法——二维树状数组+整体二分

    题目:https://www.luogu.org/problemnew/show/P1527 不难想到(?)可以用二维树状数组.但维护什么?怎么查询是难点. 因为求第k小,可以考虑记权值树状数组,把比 ...

  9. Java中Arrays.toString ()打印二维数组及Array数组的常用操作

    1.Java中Arrays.toString () 已知打印一维数组的API为System.out.println ( Arrays.toString ();,其参数为数组名或数组指针,其支持的数据类 ...

最新文章

  1. 华为mate x2什么时候更新鸿蒙系统,华为Mate X2真机发布,今年四月可升级鸿蒙系统...
  2. 13、Excutors 结合 ThreadFactory 自动给线程加上线程名
  3. 黑马 程序员——Java基础---流程控制
  4. 模拟退火算法SA参数设置实验记录
  5. json字符串与对象如何相互转换
  6. python编写接口初识一
  7. Spring中的自动装配和Autowired
  8. Maven仓库理解、如何引入本地包、Maven多种方式打可执行jar包
  9. Python中的AES加解密算法
  10. word里面用mathtype编辑公式转成PDF后出现乱码
  11. 动态分配IP之dhcp服务
  12. 「45课时热泵仿真」Excel热泵系统热力计算与仿真全课程
  13. 能耗分项计量监测系统在某大型公建中的应用
  14. Java 发送消息模版内容换行(包含微信,企业微信)
  15. 大型网站架构演变史(含技术栈与价值观)
  16. iOS开发笔记 -- 动态切换APP的logo
  17. Python学习之路:函数传递可变参数与不可变参数
  18. 【Go】Go Ubuntu 安装 gvm:Go 版本管理工具
  19. 常量的定义与使用与变量的定义与使用
  20. Java用普里姆算法(prim)解决修路最短路径问题

热门文章

  1. vs2010 问题 LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
  2. 【STSRM13】绵津见
  3. 七牛云音视频新功能:音频支持AAC_HE
  4. CI框架 -- CLI执行php代码
  5. C#如何控制方法的执行时间,超时则强制退出方法执行
  6. nginx+keepalived双master负载均衡配置
  7. lwip协议栈中超时定时器实现原理
  8. PAT甲级1097 Deduplication on a Linked List:[C++题解]遍历链表、两个vector
  9. 数据结构_栈和队列的区别
  10. mysql 多表查询实例讲解_mysql多表连接查询实例讲解