解题思路: 不想从前往后扫描,想从后往前扫描,抢救不回来了。
注意事项:
参考代码:
/** * @author fzy * @create 2021/10/11 9:56 **/ import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int[] arr=new int[1000]; int length=0; while (sc.hasNext()) { arr[length]=sc.nextInt(); length++; } // arr=new int[]{30,20,10,40,50,60,70,8,7,5,4,9,3,2}; // length=14; System.out.println(lengthOfLDS(arr,length)); System.out.println(lengthOfLIS(arr,length)); } //最长不上升子序列 public static int lengthOfLDS(int[] arr,int length){ int[] dp=new int[length]; dp[0]=1; int res=1;//最长长度 int resIndex=0;//最长不上升子序列的最后一个字符的索引 for(int i=1;i<length;i++){ int index=-1; dp[i]=1; /当前元素小于或等于 最长序列的最后一个字符 直接算入最长序列 int j=i-1; if(arr[resIndex] >= arr[i]){ dp[i]=dp[resIndex]+1; }else { while(j>=0){ if(arr[j]>=arr[i]){ index=j; dp[i]=dp[index]+1; break; } j--; } } res=Math.max(dp[i],res); resIndex=Math.max(j+1,resIndex); } return res; } //最长上升子序列 public static int lengthOfLIS(int[] arr,int length){ int[] dp=new int[length]; dp[0]=1; int res=0; int resIndex=0; for(int i=1;i<length;i++){ int index=-1; dp[i]=1; int j=i-1; if(arr[resIndex] < arr[i]){ dp[i]=dp[resIndex]+1; }else { while(j>=0){ if(arr[j]<arr[i]){ index=j; dp[i]=dp[index]+1; break; } j--; } } res= Math.max(dp[i], res); resIndex=Math.max(j+1, resIndex); } return res; } }
0.0分
0 人评分