动态规划:
- 状态定义:
dp[i]
表示以索引为第i
个字符结尾的最长递增子序列的长度,d[n-1]
表示以第n-1
个字符作为结尾的最长递增子序列的长度,但是这并不是答案,因为整个序列中的最长递增子序列不一定以n-1
结尾,所以应该取出dp
数组中的最大值。 - 状态转移:想要求
dp[i]
的值,遍历0-i
之间的dp[j]
,如果nums[i]>nums[j]
,则表示第i个字符可以嵌在第j个字符后面,dp[i]=dp[j]+1
,不断遍历j
,dp[i]
取遍历过程中的最大值即可,即dp[i] = Math.max(dp[i], dp[j] + 1)
- 状态初始化:
nums
的长度最小为1
,表示最少有一个数字,dp[0]
表示以第一个字符为结尾的最长递增子序列的长度,dp[0]=1
,而其他所有位置的数字都至少存在一个只包含自身的最长递增子序列,因此dp
数组中所有初始值都应该设置成dp[i]=1
。
class Solution {public int lengthOfLIS(int[] nums) {int maxLen = 1;int n = nums.length;int[] dp = new int[n];Arrays.fill(dp, 1);for (int i = 1; i < n; ++i) {for (int j = 0; j < i; ++j) {if (nums[i] > nums[j]) dp[i] = Math.max(dp[i], dp[j] + 1);}maxLen = Math.max(maxLen, dp[i]);}// return dp[n];return maxLen;}
}