package com.sinaWeibo.interview;

import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet; /**
* @Author: weblee
* @Email: likaiweb@163.com
* @Blog: http://www.cnblogs.com/lkzf/
* @Time: 2014年10月25日下午5:22:58
*
************* function description *************** m个长度为n的ordered array,求top
* k 个 数字 *
****************************************************
*/ public class Top1000From2000Arrays {
/*
* 从m个数组中各取一个数,并记录每个数的来源数组,建立一个含k个元素的大根堆。
* 此时堆顶就是最大的数,取出堆顶元素,并从堆顶元素的来源数组中取下一个数加入堆,再取最大值,一直这样进行k次即可。
* 时间复杂度:k*log2(20)
*/
public static int[] maxK(final int k, int[][] arrays) {
int count = 0;
Node max = null;
int[] result = new int[k]; TreeSet<Node> set = new TreeSet<Node>(new NodeComparator()); set.add(new Node(arrays[0][0], 0, 0)); for (int i = 0; i < arrays.length; i++) {
if (set.first().value < arrays[i][arrays[i].length - 1]) {
set.add(new Node(arrays[i][arrays[i].length - 1], i,
arrays[i].length - 1)); if (set.size() > k) { max = set.first();
result[count++] = max.value;
set.remove(set.first());
set.add(new Node(arrays[max.originX][max.originY - 1], max.originX,
max.originY - 1)); // testing
Iterator<Node> iter = set.iterator();
while (iter.hasNext()) {
System.out.print(iter.next().value + "\t");
}
System.out.println();
// testing
}
}
} while (true) {
max = set.first();
result[count++] = max.value; if (count == k) {
break;
} set.remove(set.first());
set.add(new Node(arrays[max.originX][max.originY - 1], max.originX,
max.originY - 1)); // testing
Iterator<Node> iter = set.iterator();
while (iter.hasNext()) {
System.out.print(iter.next().value + "\t");
}
System.out.println();
// testing
} return result;
} public static void main(String[] args) {
int[][] arrays = { { 4, 5, 6, 12 }, { 1, 2, 3, 45 }, { 3, 4, 5, 89 },
{ 101, 102, 103, 189 },{ 11, 12, 13, 289 } }; int[] result = maxK(4, arrays); for (int num : result) {
System.out.print(num + "\t");
}
} } class Node {
int value;
int originX;
int originY; public Node(int value, int originX, int originY) {
this.value = value;
this.originX = originX;
this.originY = originY;
}
} class NodeComparator implements Comparator<Node> { @Override
public int compare(Node o1, Node o2) {
// TODO Auto-generated method stub
return -(o1.value - o2.value);
} }

面试题:m个长度为n的ordered array,求top k 个 数字的更多相关文章

  1. 面试题:求第K大元素(topK)?

    一.引言二.普通算法算法A:算法B:三.较好算法算法C:算法D:四.总结 一.引言 ​ 这就是类似求Top(K)问题,什么意思呢?怎么在无序数组中找到第几(K)大元素?我们这里不考虑海量数据,能装入内 ...

  2. poj3261 后缀数组求重复k次可重叠的子串的最长长度

    Milk Patterns Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 13669   Accepted: 6041 Ca ...

  3. (笔试题)删除K位数字

    题目: 现有一个 n 位数,你需要删除其中的 k 位,请问如何删除才能使得剩下的数最大? 比如当数为 2319274, k=1 时,删去 2 变成 319274 后是可能的最大值. 思路: 1.贪心算 ...

  4. 求小于等于k长度的最大区间和

    题意 给出一个序列,求长度小于等于k的最大区间和并输出起点和终点 1<=n<=100000 1<=k<=n   题解:先算出前缀和,利用单调队列的性质,在单调队列中存储sum[ ...

  5. 解决js array的key不为数字时获取长度的问题

    最近写js时碰到了当数组key不为数字时,获取数组的长度为0 的情况. 1.问题场景 var arr = new Array(); arr[‘s1‘] = 1001; console.log(arr. ...

  6. 剑指Offer面试题29(java版):数组中出现次数超过一半的数字

    题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 比如输入一个长度为9的数组{1,2,3,2.2,2.5,4,2}.因为数字2在数组中出现5次,超过数组长度的一半,因此输出2. 解 ...

  7. Day_11【集合】扩展案例4_删除长度大于5的字符串,删除元素包含0-9数字的字符串

    分析以下需求,并用代码实现 1.定义ArrayList集合,存入多个字符串 如:"ab1" "123ad" "bca" "dadf ...

  8. [程序员代码面试指南]第9章-在两个长度相等的排序数组中找到第k小的数(二分)

    题目 给定两个有序数组arr1和arr2,再给定一个整数k,返回所有的数中第k小的数. 题解 利用题目"在两个长度相等的排序数组中找到第上中位数"的函数 分类讨论 k < 1 ...

  9. 数轴上从左到右有n个点a[0],a[1]…,a[n-1],给定一根长度为L的绳子,求绳子最多能覆盖其中的几个点。要求算法复杂度为o(n)。

    #include <iostream> using namespace std; int maxCover(int* a, int n, int l) { ; ; ; while(end ...

随机推荐

  1. Install Package and Software

    svn http://tortoisesvn.sourceforge.net/ git https://download.tortoisegit.org/ http://git-for-windows ...

  2. Hyper-V虚拟化--逻辑网络、VM网络、逻辑交换机

    逻辑网络承接物理网卡和VM网卡 可以关联站点.主机组.VLAN.IP子网,配置静态IP地址池(虚机的PA地址从该静态IP地址池获取) 只有当逻辑网络中的网络站点关联了VLAN后,在VM中才可以选择VL ...

  3. .NET技术-.NET各大网站-编程技术网址

    Source Code: http://www.codeproject.com/ The Code Projecthttp://www.tomore.com/ 中 国盟动力http://www.cod ...

  4. android自定义View之钟表诞生记

    很多筒子觉得自定义View是高手的象征,其实不然.大家觉得自定义View难很多情况下可能是因为自定义View涉及到了太多的类和API,把人搞得晕乎乎的,那么今天我们就从最简单的绘图API开始,带大家来 ...

  5. 【邮件】imap与pop3的区别

    文:铁乐猫 2015 10月14日 今天替一位在外出差的用户安装和设置完foxmail用于收发邮件,到下午被告知对方用foxmail发完邮件后,在网页上登录邮箱后并没有看到在foxmail中" ...

  6. config文件中可以配置查询超时时间

    web.config配置数据库连接 第一种:获取连接字符串 首先要定义命名空间 system.configuration 1.  string connstr= string constr = Con ...

  7. Algorithm

    经过慎重考虑,也经过反复思考.查阅网上相关资料 一位高手对我的建议: 一般要做到50行以内的程序不用调试.100行以内的二分钟内调试成功.acm主要是考算法的 ,主要时间是花在思考算法上,不是花在写程 ...

  8. Nuget 自动上传

    1:参考https://newnugetpackage.codeplex.com/wikipage?title=NuGet%20Package%20To%20Create%20A%20NuGet%20 ...

  9. linux下神奇的script命令

    script 是一个神奇命令,script 能够将终端的会话过程录制下来,然后使用 scriptreplay 就可以将其录制的结果播放给他人观看.script 的好处就在于你在终端中的所有操作.敲过的 ...

  10. PHP中的魔术方法总结

    1.__get.__set这两个方法是为在类和他们的父类中没有声明的属性而设计的__get( $property ) 当调用一个未定义的属性时访问此方法__set( $property, $value ...