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 + " "); } 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 + " "); } 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 + " "); } } } 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); } }