要求:
给定一个无序的整数数组,找到其中最长上升子序列的长度。
示例:
输入: [10,9,2,5,3,7,101,18]
输出: 4
解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。
注意:
子序列不同于子数组,并不要求是连续的。
思路:
- 动态规划,参照labuladong的框架写的
- 确定base case:dp数组全部初始化为1,因为最初都为1
- 确定状态变量:
- 确定选择:
- 确定dp函数或dp数组的定义:dp[i]表示以nums[i]为结尾的最长递增子序列的长度。
- 总体思路: 先明确dp数组的定义;然后根据其定义,假设dp[0...i-1]都已知,运用数学归纳的思想,利用前面的已知项求出dp[i]。dp[i]等于某个dp[n]+1;dp[n]是符合nums[n]<=nums[i]的所有索引下的dp数组中的最大值。
代码:
class Solution {
public int lengthOfLIS(int[] nums) {
int[] dp = new int[nums.length];
Arrays.fill(dp, 1);
int res = 0;
for (int i = 0; i<nums.length; i++) {
for (int j = 0; j < i; j++) {
if (nums[i] > nums[j]) {
dp[i] = Math.max(dp[i], dp[j]+1);
}
}
}
for (int i = 0; i < nums.length; i++) {
res = Math.max(res, dp[i]);
}
return res;
}
}