您的位置:首页 > 其它

最长递增子序列

2014-11-21 11:11 134 查看
问题:

给定一个整数数组,返回数组的最长递增子序列

分析:

设原数组为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);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  最长递增子序列