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. asp.net中为什么修改了配置文件后我们不需要重启IIS

    本文转载:http://blog.itpub.net/12639172/viewspace-659819/ 大家知道,asp.net中,如果我们修改了配置文件只要把它保存之后,就会立刻反应到程序中, ...

  2. 杭电ACM1218——Blurred Vision

    题目有点长,并且比較难懂.看了非常久.也看的不是非常懂,仅仅知道输入输出的格式. 直到看了最后的一句话,也就是output那里的最后一句话,题目的意思就非常明白了,就是输出的每个点的像素是原始的四个像 ...

  3. 实战RPM包制作

    在开发中经常会用到一些rpm包,但是一直没有自己手动制作过.今天在制作的时候意外地还解决了自己以前一直困惑的问题,就是怎么制作rpm debuginfo包,类似CentOS官网那样的debuginfo ...

  4. c# 判断网络是连接到互联网

    方法1:InternetGetConnectedState         [System.Runtime.InteropServices.DllImport("wininet") ...

  5. UVA 10714 Ants 蚂蚁 贪心+模拟 水题

    题意:蚂蚁在木棍上爬,速度1cm/s,给出木棍长度和每只蚂蚁的位置,问蚂蚁全部下木棍的最长时间和最短时间. 模拟一下,发现其实灰常水的贪心... 不能直接求最大和最小的= =.只要求出每只蚂蚁都走长路 ...

  6. count(1) count(*)

    mysql from t; +---+ | +---+ | | | | +---+ rows in set (0.00 sec) mysql) from t; +----------+ ) | +-- ...

  7. 第九篇:web之前端之web上传文件的方式

    前端之web上传文件的方式   前端之web上传文件的方式 本节内容 web上传文件方式介绍 form上传文件 原生js实现ajax上传文件 jquery实现ajax上传文件 form+iframe构 ...

  8. HTML5 PC、Mobile调用摄像头(navigator.getUserMedia)

    废话少说,先贴上代码 html: <div id="main" class="masthead"> <div id="face_sc ...

  9. 1066. Root of AVL Tree

    An AVL tree is a self-balancing binary search tree.  In an AVL tree, the heights of the two child su ...

  10. mysqldump: unknown option '--no-beep'

    想要备份mysql数据库时,输入mysqldump命令出现如题所示的错误,在网上找了好久,终于从一个帖子上得到了一些提示,就动手试了下,嘿  还真成了!! mysqldump --no-default ...