1. 题目
2. 分析
显然是一道动态规划的题目:
- 明确dp数组含义
以当前节点为结尾的子序列的最大长度
-
递推公式 dp[i] = max(dp[i-1...0]) + 1 (num[i] > nums[j])
-
如何初始化
数组所有值都是1
- 如何遍历
第一层循环从1开始到n-1;第二层循环从i-1到0
- 边界条件
当只有一个数字时,max定义为1
3. 代码
public int lengthOfLIS(int[] nums) {
//以当前为结尾的最长子序列
//dp[n] = 1
//从1开始遍历,第二次循环遍历i之前的,如果有小于当前的,+1
int[] dp = new int[nums.length];
Arrays.fill(dp, 1);
int res = 1;
for (int i = 1; i < nums.length; i++) {
int max = 0;
for (int j = i - 1; j >= 0; j--) {
if (nums[j] < nums[i]) {
max = Math.max(max, dp[j]);
}
}
dp[i] = max + 1;
res = Math.max(dp[i], res);
}
return res;
}