题目

打印N 个数组整体最大的Top K

java代码

package com.lizhouwei.chapter8;

/**
* @Description: 打印N 个数组整体最大的Top K
* @Author: lizhouwei
* @CreateDate: 2018/5/9 20:11
* @Modify by:
* @ModifyDate:
*/
public class Chapter8_20 { public 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.print("TOP" + topK + ": ");
HeapNode node = null;
for (int i = 0; i < topK; i++) {
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 void heapInsert(HeapNode[] heap, int index) {
int parent = 0;
while (index > 0) {
parent = (index - 1) / 2;
if (heap[parent].value < heap[index].value) {
swap(heap, parent, index);
} else {
break;
}
}
} public void heapify(HeapNode[] heap, int index, int heapSize) {
int left = 2 * index + 1;
int right = 2 * index + 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) {
break;
}
swap(heap, largest, index);
index = largest;
left = 2 * index + 1;
right = 2 * index + 2;
}
} public void swap(HeapNode[] heap, int a, int b) {
HeapNode temp = heap[a];
heap[a] = heap[b];
heap[b] = temp;
}
} 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 main(String[] args) {
Chapter8_20 chapter = new Chapter8_20();
int[][] arr = {{219, 405, 538, 845, 971}, {148, 558}, {52, 99, 348, 691}};
chapter.printTopK(arr, 5);
}
}

结果

《程序员代码面试指南》第八章 数组和矩阵问题 打印N 个数组整体最大的Top K的更多相关文章

  1. 程序员代码面试指南 IT名企算法与数据结构题目最优解

    原文链接 这是一本程序员面试宝典!书中对IT名企代码面试各类题目的最优解进行了总结,并提供了相关代码实现.针对当前程序员面试缺乏权威题目汇总这一痛点,本书选取将近200道真实出现过的经典代码面试题,帮 ...

  2. 程序员代码面试指南:IT名企算法与数据结构题目最优解

      第1章栈和队列 1设计一个有getMin功能的栈(士★☆☆☆) 1由两个栈组成的队列(尉★★☆☆) 5如何仅用递归函数和栈操作逆序一个栈(尉★★☆☆) 8猫狗队列(士★☆☆☆)10用一个栈实现另一 ...

  3. [程序员代码面试指南]数组和矩阵问题-找到无序数组中最小的k个数(堆排序)

    题目链接 https://www.nowcoder.com/practice/6a296eb82cf844ca8539b57c23e6e9bf?tpId=13&tqId=11182&t ...

  4. [程序员代码面试指南]栈和队列-最大值减去最小值 小于或等于num 的子数组的数量(单调队列)

    题目 给定数组arr和整数num,求数组的子数组中有多少个的满足"最大值减去最小值<=num". 解题思路 分析题目,有结论: 如果数组arr[i...j]满足条件,则它的每 ...

  5. 《程序员代码面试指南》第八章 数组和矩阵问题 数组的partition 调整

    题目 数组的partition 调整 java代码 package com.lizhouwei.chapter8; /** * @Description: 数组的partition 调整 * @Aut ...

  6. 《程序员代码面试指南》第八章 数组和矩阵问题 在数组中找到出现次数大于N/K 的数

    题目 在数组中找到出现次数大于N/K 的数 java代码 package com.lizhouwei.chapter8; import java.util.ArrayList; import java ...

  7. 《程序员代码面试指南》第八章 数组和矩阵问题 找到无序数组中最小的k 个数

    题目 找到无序数组中最小的k 个数 java代码 package com.lizhouwei.chapter8; /** * @Description: 找到无序数组中最小的k 个数 * @Autho ...

  8. 《程序员代码面试指南》第一章 栈和队列 构造数组的MaxTree

    题目 给出一个无重复元素的数组,构造此数组的MaxTree, java代码 /** * @Description: 构造数组的MaxTree * @Author: lizhouwei * @Creat ...

  9. 《程序员代码面试指南》第七章 位运算 在其他数都出现k 次的数组中找到只出现一次的数

    题目 在其他数都出现k 次的数组中找到只出现一次的数 java 代码 package com.lizhouwei.chapter7; /** * @Description: 在其他数都出现k 次的数组 ...

随机推荐

  1. 单源最短路Dijstra算法

    Dijstra算法是寻找从某一顶点i出发到大其他顶点的最短路径.Distra算法的思想与Prim算法很像,它收录顶点的规则是按照路径长度递增的顺序收录的.设v0是源顶点,我们要寻找从v0出发到其他任意 ...

  2. Activity入门(一)

    生命周期         onCreate():activity进行创建,在该方法中应调用setContentView(),findViewById()以及获取要展示的数据的方法(如调用manager ...

  3. sqlite constraint

    sqlite3中的约束例如以下: CREATE TABLE CheckTable (rowId integer primary key autoincrement, name text not nul ...

  4. 如何删除mysql 主键索引

    如果一个主键是自增长的,不能直接删除该列的主键索引, 应当先取消自增长,再删除主键特性   alter table 表名 drop primary key; [如果这个主键是自增的,先取消自增长.] ...

  5. SharePoint 2013 对话框

    The quick way to open a sharepoint 2013 dialog modal form is via Javascript below 1 2 3 4 5 function ...

  6. MongoDB 快速入门

    本作品由Man_华创作,采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可.基于http://www.cnblogs.com/manhua/上的作品创作. MongoDB No ...

  7. C# 字节数组拼接的速度实验(Array.copy(),Buffer.BlockCopy(),Contact())

    无聊做了如题的一个算法的优劣性能比较,由于很多人都只关心结果,那么我先贴出结果如下: 由于我的测试数据量比较小,只能得出Array.Copy()和Buffer.BlockCopy()方法性能要好于Co ...

  8. [ACM] hdu 1029 Ignatius and the Princess IV (动归或hash)

    Ignatius and the Princess IV Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32767K (Ja ...

  9. iOS中 扫描二维码/生成二维码具体解释 韩俊强的博客

    近期大家总是问我有没有关于二维码的demo,为了满足大家的需求,特此研究了一番,希望能帮到大家! 每日更新关注:http://weibo.com/hanjunqiang  新浪微博 指示根视图: se ...

  10. 2014年7月微软MVP名单揭晓!

    微软公司于2001年8月起開始在亚洲与各大基本的第三方站点上的微软技术相关论坛合作,微软称之为"亚洲社区支持"计划.    为了鼓舞大家在论坛中更好地互相帮助,共同提高,微软在全亚 ...