问题:
给定一个整数数组,返回数组的最长递增子序列
分析:
设原数组为a, 将a排序得到b, 则 a 和 b 的最长公共子序列就是数组的 a 的最长递增子序列
package javainterview.string;
import java.util.Arrays;
public class LIS {
public static String lis(int[] arr){
if(arr==null || arr.length == 0)
return null;
int[] sortArr = Arrays.copyOf(arr, arr.length);
Arrays.sort(sortArr);
return lcs(arr, sortArr);
}
//最长公共子序列
public static String lcs(int[] a, int[] b){
int[][] dp = new int[a.length+1][b.length+1];
for(int i=0; i< a.length; i++){
for(int j=0; j< b.length; j++){
if(a[i] == b[j])
dp[i+1][j+1] = dp[i][j]+1;
else
dp[i+1][j+1] = Math.max(dp[i+1][j], dp[i][j+1]);
}
}
StringBuilder sb = new StringBuilder();
int x = a.length;
int y = b.length;
while(x!=0 && y!=0){
if(dp[x][y] == dp[x-1][y])
x--;
else if(dp[x][y] == dp[x][y-1])
y--;
else{
sb.append(a[x-1]);
x--;
y--;
}
}
return sb.reverse().toString();
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr = {0,5,6,7,2,3,4};
String res = lis(arr);
System.out.println(res);
}
}