LeetCode-300-最长上升子序列
题目
给定一个无序的整数数组,找到其中最长上升子序列的长度。
示例: 输入: [10,9,2,5,3,7,101,18] 输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。
思路
使用DP数组存储当前位置的最长上升子序列长度。
位置 i 的最长子序列长度由 i 之前的小于num[i] 的值中的最长上升子序列长度+1计算得到。
示例: 数组num:[10,9,2,5,3,7,101,18] 数组dp: [1,1,1,2,2,3,4,4] 输出:4
状态转移方程: dp[i] =max( dp[j] ) + 1 ,其中,num[j]<num[i].
1 public int lengthOfLIS(int[] nums) { 2 int re = Integer.MIN_VALUE; 3 if (nums.length == 0) return 0; 4 int[] dp = new int[nums.length]; 5 6 dp[0] = 1; 7 8 for(int i=1;i<nums.length;i++) { 9 int maxlen = Integer.MIN_VALUE; 10 for(int j=i-1;j>=0;j--) { 11 12 if(nums[j]<nums[i] && dp[j]>maxlen) { 13 maxlen = dp[j]; 14 } 15 else if(j==0 && nums[j]>nums[i] && maxlen == Integer.MIN_VALUE) 16 maxlen = 0; 17 18 } 19 dp[i] = maxlen + 1; 20 21 } 22 23 for(int i=0;i<dp.length;i++) { 24 if(dp[i] > re) re = dp[i]; 25 } 26 27 28 return re ; 29 }