一起养成写作习惯!这是我参加「日新计划 4 月更文挑战」的第4天,点击查看活动概况。

一、问题描绘

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

子序列 是由数组派生而来的序列,删去(或不删去)数组中的元素而不改动其他元素的次序。例如,[3,6,2,7]是数组[0,3,1,6,2,2,7]的子序列。

题目链接:最长递增子序列。

二、题目要求

样例 1

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

样例 2

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

调查

1.子序列、动态规划
2.主张用时15~35min

三、问题分析

关于这一道能够运用动态规划、二分查找处理,动态规划虽然履行用时多一些,但理解起来比较简单,所以用动态规划完结这一题。

还记得咱们之前关于动态规划的三步走战略吗,之前的动态规划的力扣习题相当于入门,假如没有了解过动态规划,能够试着从这一篇入门题解开始做起:

算法题每日一练—第34天: 青蛙跳台阶开始做起。

还是用咱们的三步走战略:

第一步 含义搞懂:

这是道一维的动态规划,其间dp[i]就代表第i个下标为终点的子序列最大长度。

第二步 变量初始:

变量初始的话,关于每一个dp[i],最坏的情况就是前面的数字悉数比i大,那它就只能是孤零零的1了。

第三步 规则概括:

算法题每日一练---第70天:最长递增子序列

在确认dp[i]的值之前,dp[0~i-1]的值咱们应该都知道了。

界说j=i-1

那咱们从0~j开始遍历,只需当时方位nums[i]>nums[j],那咱们就把nums[i]参加dp[j]的大家庭之中,

dp[i]=dp[j]+1;(参加的这个1就是nums[i])。

规则这不就概括出来了,因为dp[i]一开始都初始化1,只需nums[i]>nums[j],那么咱们比较一下大小就行了

dp[i]=max(dp[j]+1,dp[i]);

三步走,打完收工!

四、编码完成

class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        int i,j,n=nums.size(),dp[n+2],ans=0;//初始化变量
        for(i=0;i<n;i++)//循环i
        {
            dp[i]=1;//变量初始
            for(j=0;j<i;j++)//遍历i之前的数字
            {
                if(nums[j]<nums[i])//假如i比j对应的数据大
                    dp[i]=max(dp[j]+1,dp[i]);//nums[i]参加大家庭
            }
            ans=max(ans,dp[i]);//寻找最大值
        }
        return ans;//回来成果
    }
};

五、测试成果

算法题每日一练---第70天:最长递增子序列

算法题每日一练---第70天:最长递增子序列