leetcode 300: 给定一个无序的整数数组,找到其中最长上升子序列的长度。
示例:
输入: [10,9,2,5,3,7,101,18]
输出: 4
解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。
数组用a[n]表示,最长子序列的长度用dp[n]来表示,即数组从0-i元素时,最长子序列的长度。
1.先不考虑上升,子序列有很多个,像[10]、[10,9,2]、[10,9,2,5,3,7]等所有排列组合个
2.保证值是上升的话,即当i>j,a[i]>a[j]时,dp[i]的值最大,也即子序列有a[i]这个元素时的dp[i]值最大;也即dp[i]=max{dp[1], dp[2], dp[3]....dp[j]}+1
......
层层递推,最终递推到dp[1]和dp[0],而这些初始状态是已知的。
代码部分
1 public static int lengthOfLIS(int[] nums) { 2 if(nums == null || nums.length==0){ 3 return 0; 4 } 5 int[] dp = new int[nums.length+1]; 6 for(int i=0;i<nums.length;i++) { 7 dp[i] = 1; 8 } 9 int maxLength = 1; 10 for(int i=1;i< nums.length;i++) { 11 for(int j=0;j<i;j++) { 12 if(nums[j]<nums[i]){ 13 dp[i] = Math.max(dp[i], dp[j]+1); 14 } 15 } 16 maxLength = Math.max(maxLength, dp[i]); 17 } 18 System.out.println("最长上升子序列的长度:"+maxLength); 19 return maxLength; 20 }