算法原型---------最长递增子序列

ArrayList.get(i)的值代表 i + 1长度的递增子序列的最小末尾。

import java.util.ArrayList;

public class Main {
	public static void main(String[] args) {
		int[] a = new int[5];
		a[0] = 2;
		a[1] = 1;
		a[2] = 8;
		a[3] = 3;
		a[4] = 4;
		System.out.println(len(a));
	}

	public static int len(int[] a) {
		ArrayList<Integer> b = new ArrayList<>();
		b.add(a[0]);
		for (int i = 1; i < a.length; i++) {
			if (a[i] > b.get(b.size() - 1)) {
				b.add(a[i]);
			} else {
				int index = search(a[i], b);
				b.set(index, a[i]);
			}
		}
		return b.size();
	}

	public static int search(int key, ArrayList<Integer> b) {
		int min = 0;
		int max = b.size();
		int mid = 0;
		while (min <= max) {
			mid = (min + max) >> 1;
			if (key > b.get(mid)) {
				min = mid + 1;
			} else if (key < b.get(mid)) {
				max = mid - 1;
			} else {
				return mid;
			}
		}
		return min;
	}
}

 

posted @ 2016-12-08 18:16  曹某某的博客  阅读(172)  评论(0编辑  收藏  举报