算法-动态规划-子序列

Keep thinking. / 2024-10-11 / 原文

子序列问题动态规划 解决的经典问题。

1. 最长递增子序列 (LeetCode 300)

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

输入:nums = [10,9,2,5,3,7,101,18]
输出:4
解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。

思路

  • dp[i]表示以nums[i]为结尾的最长子序列的长度
  • 用j遍历0至i-1的元素,如果nums[i] > nums[j],则dp[i] = Math.max(dp[i], dp[j]+1)(可以用nums[i]追加在之前的子序列末尾)
class Solution {
    // 时间复杂度:O(n^2)
    public int lengthOfLIS(int[] nums) {
        int result = 1;
        int n = nums.length;
        // dp[i]表示 以nums[i]结尾的最长子序列长度
        int[] dp = new int[n];
        
        for(int i = 0; i<n; ++i) {
            dp[i] = 1;
        }

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

        return result;
    }
}