题目描述

给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。

子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余> 元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。


解题思路:

  1. dp[i] 表示以 nums[i] 这个数结尾的最长递增子序列的长度
  2. dp[i] 初始值为 1,因为以 nums[i] 结尾的最长递增子序列起码要包含它自己
  3. 最终结果(子序列的最大长度)应该是 dp 数组中的最大值
  4. 假设nums[5] = 3,既然是递增子序列,只要找到前面那些结尾比 3 小的子序列,然后把 3 接到最后,就可以形成一个新的递增子序列,而且这个新的子序列长度加一
    static int lengthOfLIS(int[] nums) {
        int n = nums.length;
        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[i] > nums[j]) {
                    dp[i] = Math.max(dp[i], 1 + dp[j]);
                }
            }
        }
        int res = 0;
        for (int i = 0; i < dp.length; i++) {
            res = Math.max(res, dp[i]);
        }
        return res;

    }

踩坑记录:

  1. 利用已经求解过的dp数组求解后续dp数组:符合条件最大的dp数组+1即为当前所求dp数组

Q.E.D.