力扣300. 最长递增子序列(动态规划)

Problem: 300. 最长递增子序列

文章目录

  • 题目描述
  • 思路
  • 解题方法
  • 复杂度
  • Code

题目描述

力扣300. 最长递增子序列(动态规划)_第1张图片力扣300. 最长递增子序列(动态规划)_第2张图片

思路

dp[i]记录以nums[i]为结尾的序列的最大长度,那在这样一个递增子序列中(以nums[i]结尾),上一个数字为:nums[j] (0 <= j < i && nums[j - 1] < nums[i]) 中的任意一个,所以:dp[i] = max(dp[j] + 1),其中: 0 <= j < i && nums[j - 1] < nums[i]

解题方法

1.获取数组nums的大小为n;定义int类型数组dp记录以nums[i]为结尾的序列的最大长度
2.初始化dp[0]为1表示起始递增子序列长度为1
3.从dp数组下标为1处开始遍历,外层循环从1n;内存循环从1i;每次在外层循环中将dp[i]置为1,表示从当前位置开始递增子序列长度为1,内存循环中若*nums[j] < nums[i]*则dp[i] = max(dp[i], dp[j] + 1)
4.返回dp数组中的最大值

复杂度

时间复杂度:

O ( n 2 ) O(n^2) O(n2);其中 n n n表示数组nums的大小

空间复杂度:

O ( n ) O(n) O(n)

Code

class Solution {
public:
    /**
     *Dynamic programming finds the longest increasing subsequence
     * @param nums Given array(The sequence to be found)
     * @return int
     */
    int lengthOfLIS(vector<int> &nums) {
        int n = nums.size();
        vector<int> dp(n);
        dp[0] = 1;
        for (int i = 1; i < n; ++i) {
            dp[i] = 1;
            for (int j = 0; j < i; ++j) {
                if (nums[i] > nums[j]) {
                    dp[i] = max(dp[i], dp[j] + 1);
                }
            }
        }
        int result = 0;
        for (int i = 0; i < n; ++i) {
            if (dp[i] > result) {
                result = dp[i];
            }
        }
        return result;
    }
};

你可能感兴趣的:(力扣题目,leetcode,动态规划,算法)