最长递增子序列

来源:互联网 发布:淘宝上的中药能买吗 编辑:程序博客网 时间:2024/06/15 03:09

问题:

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

分析:

设原数组为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;elsedp[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 stubint[] arr = {0,5,6,7,2,3,4};String res = lis(arr);System.out.println(res);}}


0 0
原创粉丝点击