LeetCode 300. 最长递增子序列

题目描述

给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。
子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。
 
示例1:

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

示例2:

输入:nums = [0,1,0,3,2,3]
输出:4

示例3:

输入:nums = [7,7,7,7,7,7,7]
输出:1

提示:

  • 1 <= nums.length <= 2500
  • -104 <= nums[i] <= 104

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-increasing-subsequence

思路解析

这道题使用动态规划算法可以求解,时间复杂度为 \(O(n^2)\)

  • dp[i]:以 nums[i] 为结尾的最长严格递增子序列。
  • 状态转移方程:dp[i] = max(dp[j] + 1),其中所有的 j 均满足 j < i && nums[j] < nums[i]

代码实现

class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        vector<int> dp(nums.size(), 1);
        int maxLen = 0;
        for(int i = 0; i < nums.size(); i++) {
            for(int j = 0; j < i; j++)
                dp[i] = max(dp[i], (nums[i] > nums[j]) ? dp[j] + 1 : 1);
            maxLen = max(dp[i], maxLen);
        }
        return maxLen;
    }
};
posted @ 2021-03-04 14:51  行者橙子  阅读(87)  评论(0编辑  收藏  举报