Leetcode-300-最长上升子序列

题目

image.png

题解

注意
初始化: 1 个字符显然是长度为 11 的上升子序列
最终结果需要比较得到,不是最后一个

// dp[i] 表示以第i个数字为结尾的最长上升子序列长度 [0,i]内
// dp[i]=max(1+dp[j] if nums[i]>nums[j])
// dp[i] 就等于下标 i 之前严格小于 nums[i] 的状态值的最大者 +1
class Solution {
    private int[] dp;
    public int lengthOfLIS(int[] nums) {
        if (nums.length == 0) {
            return 0;
        }
        int n = nums.length;
        dp = new int[n];
        // return solver(nums, n - 1);     // 不一定是最后一个最大啊
        // 最大需要比较出来
        int res = 1;            // 3
        for (int i = 0; i < n; i++) {       // 4
            res = Math.max(res, solver(nums, i));
        }
        return res;
    }
    private int solver(int[] nums, int i) {
        if (i == 0) {          // 1
            return 1;
        }
        if (dp[i] != 0) {
            return dp[i];
        }
        int res = 1;            // 2
        for (int j = i - 1; j >= 0; j--) {
            if (nums[j] < nums[i]) {
                res = Math.max(res, solver(nums, j) + 1);
            }
        }
        dp[i] = res;
        return res;
    }
}
image.png

参考

https://leetcode-cn.com/problems/longest-increasing-subsequence/solution/dong-tai-gui-hua-er-fen-cha-zhao-tan-xin-suan-fa-p/
https://leetcode-cn.com/problems/longest-increasing-subsequence/solution/zui-chang-shang-sheng-zi-xu-lie-dong-tai-gui-hua-2/

你可能感兴趣的:(Leetcode-300-最长上升子序列)