每天一道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

题目思路

动态规划的精髓,我认为,就是站在当前位置做出判断进而得出结果。

本题中,使用一维dp数组记录到目前为止,满足要求的递增序列的最大长度。那么站在当前位置,需要进行的判断是,如果前边没有比我小的,那么我会为1,否则我应该是最长的那个递增序列的长度加一。故得到状态转移方程:dp[i]=max(dp[i],dp[j]+1);

代码

class Solution 
{
public:
    int lengthOfLIS(vector& nums) 
    {
        if(nums.size()==0) return 0;
        int maxn=0;
        int dp[3000]={0};
        dp[0]=1;
        maxn=1;
        int temp=0;
        for(int i=1;i

提交结果

每天一道leetcode:300. 最长递增子序列(动态规划&中等)_第1张图片

 欢迎大家在评论区讨论,如有不懂的代码部分,欢迎在评论区留言!

你可能感兴趣的:(动态规划,leetcode,动态规划,算法,职场和发展,c++,数据结构)