codeTop100题(27)300. 最长递增子序列

83 阅读1分钟

1. 题目

300. 最长递增子序列

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;
}