求解长度利用动态规划,求解数组,记录这个位置的前一个位置的序号索引是谁,这样可以逆序找到最后需要求解的那个最长递增子序列的数组
public class Test {
public static void main(String[] args) {
Test t=new Test();
int[] nums={1,23,4,5,33,8,90,91};
t.lengthOfLIS(nums);
}
public int lengthOfLIS(int[] nums) {
int len=nums.length;
int[] dp=new int[len];//表示以位置i结尾的最长连续的递增子数组的长度
int[] pre=new int[len];//表示这个位置的前一个序号,没有前一个的就记为-1
dp[0]=1;
pre[0]=-1;
int maxlen=1;//真正的最长子序列的长度
int index_end=0;//真正最长的那个递增子数组的最后一个位置
for(int i=1;i<len;i++){
dp[i]=1;
pre[i]=-1;//表示没有前一个数
for(int j=0;j<i;j++){
//是否可以接在各个位置的后面的统计
if(nums[i]>nums[j]){
if(dp[j]+1>dp[i]){
dp[i]=dp[j]+1;
pre[i]=j;
}
}
}
if(dp[i]>maxlen){
maxlen=dp[i];
index_end=i;
}
}
int[] arr=new int[maxlen];//最后的子序列
int i=index_end;//用于更新前一个位置是谁(可以不断往前定位)
int j=0;
while (j<maxlen){
arr[j]=nums[i];
j++;
i=pre[i];//更新前一个位置的序号
}
Arrays.sort(arr);
for (int i1 : arr) {
System.out.println(i1);
}
return maxlen;
}
}