1、题目描述
2、解题思路
动态规划问题,状态明显就是数组的内容。
设 dp[i] 表示 nums 中以 nums[i] 结尾的子数组的最长上升子序列的长度。
base_case即都为 1,原因是最差情况下,上升子序列只有一个元素。
最终返回 dp 中最大的那个值即可。
既然是递增子序列,我们只要找到前面那些结尾比 nums[i] 小的子序列,然后把 nums[i] 接到最后,就可以形成一个新的递增子序列,而且这个新的子序列长度加一。
当然,可能形成很多种新的子序列,但是我们只要最长的,把最长子序列的长度作为 dp[i]。
3、解题代码
class Solution {
public int lengthOfLIS(int[] nums) {
if (nums.length == 0) {
return 0;
}
// dp[i] 表示以 nums[i] 这个数结尾的最长递增子序列的长度
// 我们的最终结果(子序列的最大长度)应该是 dp 数组中的最大值。
int[] dp = new int[nums.length];
Arrays.fill(dp, 1); // dp 数组应该全部初始化为 1,因为子序列最少也要包含自己,所以长度最小为 1
for (int i = 1; i < dp.length; i++) {
for (int j = 0; j < i; j++) {
// 既然是递增子序列,我们只要找到前面那些结尾比 nums[i] 小的子序列
// 然后把 nums[i] 接到最后,就可以形成一个新的递增子序列,而且这个新的子序列长度加一。
// 当然,可能形成很多种新的子序列,但是我们只要最长的,把最长子序列的长度作为 dp[i]
if (nums[j] < nums[i]) {
dp[i] = Math.max(dp[i], dp[j] + 1);
}
}
}
// 找出 dp 中的最大值
int ans = 0;
for (int i : dp) {
ans = Math.max(ans,i);
}
return ans;
}
}