最长递加子序列

最长递增子序列

 

求数组中最长递增子序列

写一个时间复杂度尽可能低的程序,求一个一维数组(N个元素)中的最长递增子序列的长度。

例如:在序列1,-1,2,-3,4,-5,6,-7中,其最长的递增子序列为1,2,4,6。

public class LongestIncreasingSequence {

	/**
	 *求数组中最长递增子序列
              写一个时间复杂度尽可能低的程序,求一个一维数组(N个元素)中的最长递增子序列的长度。
              例如:在序列1,-1,2,-3,4,-5,6,-7中,其最长的递增子序列为1,2,4,6
	 */
	public static void main(String[] args) {
		int[] A = {1,-1,2,-3,4,-5,6,-7};
		LAS(A);
	}

	public static int LAS(int[] A){
		int length = A.length;
		int B[] = new int[length];
		B[0] = 1;
		int max = 1;
		for(int i=1;i<length;i++){
			int _max = 0;  //记录当前元素中比它小的元素的B[i]值最大的一个,这里只能设置为0而不能设置为1 
			int index = i;  //找出当前元素中比它小的元素,并比较B[i]值,记录最大的B[i]值的索引
			for(int j=i-1;j>=0;j--){
				if(A[j]<A[i] && B[j] > _max){
					_max = B[j];
					index = j;
				}				
			}
			if(index == i)   //索引没变,前面没有比它小的元素了,则值为1
				B[i] = 1;
			else
				B[i] = B[index] + 1;   //索引变了,则+1
			if(B[i] > max)
				max = B[i];
				
		}
		for(int i=0;i<length;i++)
			System.out.print(B[i]+ " ");
		
		System.out.println("\nThe Max Length is : " + max);
		return max;
	}
}