import java.util.*; public class LIS { public static > List lis(List n) { List> pileTops = new ArrayList>(); // sort into piles for (E x : n) { Node node = new Node(); node.value = x; int i = Collections.binarySearch(pileTops, node); if (i < 0) i = ~i; if (i != 0) node.pointer = pileTops.get(i-1); if (i != pileTops.size()) pileTops.set(i, node); else pileTops.add(node); } // extract LIS from nodes List result = new ArrayList(); for (Node node = pileTops.size() == 0 ? null : pileTops.get(pileTops.size()-1); node != null; node = node.pointer) result.add(node.value); Collections.reverse(result); return result; } private static class Node> implements Comparable> { public E value; public Node pointer; public int compareTo(Node y) { return value.compareTo(y.value); } } public static void main(String[] args) { List d = Arrays.asList(3,2,6,4,5,1); System.out.printf("an L.I.S. of %s is %s\n", d, lis(d)); d = Arrays.asList(0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15); System.out.printf("an L.I.S. of %s is %s\n", d, lis(d)); } }