leetcode 力扣 300 最长递增子序列

53 阅读1分钟

动态规划

算法思路

  • dp数组的含义,dp[i]表示,以nums[i]结尾的最长递增序列,的长度。
  • 使用两层for循环,第一层遍历nums中的每个数nums[i],第二层遍历nums[i]前面的每个数nums[j],考察每个nums[j] < nums[i],找出最大的dp[j] + 1,也就是前面以nums[j]结尾的最长序列,然后把nums[i]接在序列后面。

1.jpeg

2.jpeg

3.jpeg

4.jpeg

5.jpeg

class Solution {
    public int lengthOfLIS(int[] nums) {
        int n = nums.length;
        if (n == 1) {
            return 1;
        }

        int[] dp = new int[n];
        Arrays.fill(dp, 1);

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < i; j++) {
                if (nums[j] < nums[i]) {
                    dp[i] = Math.max(dp[i], dp[j] + 1);
                }
            }
        }

        int res = 1;
        for (int i = 0; i < n; i++) {
            if (dp[i] > res) {
                res = dp[i];
            }
        }

        return res;
    }
}