package com.interview.books.fgdsb; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.PriorityQueue; /** * Created_By: stefanie * Date: 15-2-2 * Time: 下午2:04 */ public class NLC18_SmallestRange { class IndexNode implements Comparable<IndexNode> { int offset; int idx; int value; public IndexNode(int idx, int offset, int value){ this.idx = idx; this.offset = offset; this.value = value; } public int compareTo(IndexNode o){ return this.value - o.value; } } public int[] smallestRange(List<List<Integer>> lists){ int min = Integer.MAX_VALUE; int[] minRange = new int[2]; PriorityQueue<IndexNode> heap = new PriorityQueue(); int end = 0; for(int i = 0; i < lists.size(); i++){ IndexNode node = new IndexNode(i, 0, lists.get(i).get(0)); if(node.value > end) end = node.value; heap.add(node); } while(heap.size() == lists.size()){ IndexNode node = heap.poll(); if(end - node.value < min){ min = end - node.value; minRange[0] = node.value; minRange[1] = end; } if(node.offset < lists.get(node.idx).size() - 1){ node.offset++; node.value = lists.get(node.idx).get(node.offset); if(node.value > end) end = node.value; heap.add(node); } } return minRange; } public static void main(String[] args){ NLC18_SmallestRange finder = new NLC18_SmallestRange(); List<List<Integer>> lists = new ArrayList(); lists.add(Arrays.asList(new Integer[]{4,10,15,24,26})); lists.add(Arrays.asList(new Integer[]{0,9,12,20})); lists.add(Arrays.asList(new Integer[]{5,18,22,30})); int[] range = finder.smallestRange(lists); System.out.println(range[0] + ", " + range[1]); } }