首页 > 其他分享 >LeetCode300.最长递增子序列

LeetCode300.最长递增子序列

时间:2024-08-20 19:28:57浏览次数:12  
标签:结尾 nums 递增 LeetCode300 序列 上升 最长 dp

LeetCode300.最长递增子序列

力扣题目链接(opens new window)

给你一个整数数组 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[i],表示以nums[i]为结尾的最长上升子序列的长度
  • 我们举个例子,以示例1为例,我们来推导一下为什么可以用dp[i]来表示以nums[i]为结尾的最长上升子序列
  • nums数组: [10,9,2,5,3,7,101,18]
  1. 以10结尾的最长上升子序为:[10]
  2. 以9为结尾的最长上升子序列为:[9]
  3. 以2为结尾的最长上升子序列为:[2]
  4. 以5为结尾的最长上升子序列为:[2,5]
  5. 以3为结尾的最长上升子序列为:[2,3]
  6. 以7为结尾的最长上升子序列为:[2,3,7]
  7. 以101为结尾的最长上升子序列为:[2,3,7,101]
  8. 以18为结尾的最长上升子序列为:[2,3,7,18]
  • 由上面的分析可知,以101为结尾的最长上升子序列是我们要求的最终的结果,并且这个结果的状态可以由前面的状态推出,因此我们设立dp[i]这个状态变量表示以nums[i]为结尾的最长上升子序列。

递推公式:

  • 我们可以设立两个指针i,j来进行操作,i指针来遍历nums的每一个元素,j指针来遍历nums[i]之前的所有元素,由于我们要找出最大的上升子序列,所以说每个元素我们都要找到nums中在这个元素之前的所有比这个元素要小的元素,这样才能尽可能的构成最大的递增子序列。

  • 所以说我们使用i,j指针来遍历字符串。

  • nums[i]>nums[j]时,意味着我们当前元素大于之前的一个元素,这两个元素之间可以构成一个递增子序列,所以说我们可能要进行更新dp[i],为什么是可能呢?因为我们dp[i]的值可能比dp[j]+1(dp[j]+1的意思就是前j个元素构成的递增序列,再加上num[i]这个值的长度)这个值更大,所以说我们得取一个最大的值。

  • 因此,递推公式为:

        vector<int> dp(nums.size(),1);
        int ans=1;
        for(int i=1;i<nums.size();i++){
            for(int j=0;j<i;j++){
                if(nums[i]>nums[j]) dp[i]=max(dp[i],dp[j]+1);
            }
            ans=max(ans,dp[i]);
        }

遍历顺序

  • 由于dp[i]是要由它之前的元素dp[j]来推导的,因此遍历顺序明显是从前向后遍历

如何初始化?

  • 首先,我们将dp[i]中的所有值全都初始化为1,因为每个元素至少都有一个递增子序列(也就是它本身构成的子序列)
  • 然后,依据我们的递推公式从前向后进行初始化操作即可。

举例验证dp数组

  • nums数组: [10,9,2,5,3,7,101,18]
  1. 以10结尾的最长上升子序为:[10]
  2. 以9为结尾的最长上升子序列为:[9]
  3. 以2为结尾的最长上升子序列为:[2]
  4. 以5为结尾的最长上升子序列为:[2,5]
  5. 以3为结尾的最长上升子序列为:[2,3]
  6. 以7为结尾的最长上升子序列为:[2,3,7]
  7. 以101为结尾的最长上升子序列为:[2,3,7,101]
  8. 以18为结尾的最长上升子序列为:[2,3,7,18]
  • 这个例子也说明了我们的dp数组是正确的

代码实现

class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        vector<int> dp(nums.size(),1);
        //这个初始值为1,因为至少都有长度为1的递增子序列
        int ans=1;
        for(int i=1;i<nums.size();i++){
            for(int j=0;j<i;j++){
                if(nums[i]>nums[j]) dp[i]=max(dp[i],dp[j]+1);
            }
            ans=max(ans,dp[i]);
        }
        return ans;
    }
};

标签:结尾,nums,递增,LeetCode300,序列,上升,最长,dp
From: https://www.cnblogs.com/Tomorrowland/p/18370112

相关文章

  • 深度学习--时间序列预测方法总结
    时间序列预测是分析和预测一系列时间顺序数据的方法。不同的时间序列预测方法在应用中根据数据特征和目标有不同的适用性。以下是时间序列预测方法的详细总结,包括概念、原理和Python实现代码。1.简单平均法(SimpleAverageMethod)概念与原理:简单平均法是最简单的时间序列......
  • [Flink] Flink 序列化器
    1概述:Flink(反)序列化器简述序列化器:多用于Sink输出时反序列化器:多用于Source读取时依赖包及版本依赖包及版本信息(汇总)org.apache.kafka:kafka-clients:${kafka-clients.version=2.4.1}org.apache.flink:flink-java:${flink.version=1.12.6}org.apache.flink......
  • 【第68课】Java安全&原生反序列化&SpringBoot攻防&heapdump提取&CVE
    免责声明本文发布的工具和脚本,仅用作测试和学习研究,禁止用于商业用途,不能保证其合法性,准确性,完整性和有效性,请根据情况自行判断。如果任何单位或个人认为该项目的脚本可能涉嫌侵犯其权利,则应及时通知并提供身份证明,所有权证明,我们将在收到认证文件后删除相关内容。文中所涉......
  • LCP:60 排列序列[leetcode-4]
    LCP:60排列序列给出集合[1,2,3,...,n],其所有元素共有n!种排列。按大小顺序列出所有排列情况,并一一标记,当n=3时,所有排列如下:"123""132""213""231""312""321"给定n和k,返回第k个排列。示例1:输入:n=3,k=3输出:"213"示例2:输入:n=4,......
  • 序列容器
    序列容器序列容器以线性序列的方式存储元素。它没有对元素进行排序,元素的顺序和存储它们的顺序相同。5种标准的序列容器,每种容器都具有不同的特性:array<T,N>(数组容器):长度固定的序列,有N个T类型的对象,不能增加或删除元素。vector<T>(向量容器):长度可变的序列,用来存放......
  • StoryGAN——用于生成基于图片序列的故事或剧情内容
    一、StoryGAN的介绍StoryGAN是一种用于生成多张连续图像来讲述故事的生成模型,它将图像生成与文本生成结合在一起,以生成与故事叙述匹配的视觉序列。StoryGAN的应用场景主要包括生成漫画、故事板和动画短片。二、StoryGAN的使用场景漫画生成:StoryGAN可用于根据文本生成连......
  • 金蝶云星空解锁时同时解锁序列号
     业务背景公司业务要求,如果检查发现序列号有问题,先锁库不允许出库。如果已经锁库,此时序列号允许出库,则可以解锁。 前置任务:金蝶云星空锁库时同时锁定序列号-lanrenka-博客园(cnblogs.com)系统现状即时库存锁库,锁定的是数量,库存-锁库数=可用数,当可用量小于等于0就......
  • 阿里开源通用多模态大模型mPLUG-Owl3:迈向多图长序列理解
             阿里的mPLUG系列在多模态大模型领域产出了多项研究工作。从mPLUG-Owl初代模型引入了视觉对齐-语言模型微调的训练模式,到mPLUG-Owl2通过模块化的模态自适应解决模态拉扯,再到mPLUG-DocOwl通过切图建模高分辨率。这一系列模型一直在探索更为高效有效的多模态......
  • 反序列化刷题(一)
    反序列化刷题web255将isvip改为true然后序列化echourlencode($v=serialize($f=newctfShowUser()));Cookie:O%3A11%3A%22ctfShowUser%22%3A3%3A%7Bs%3A8%3A%22username%22%3Bs%3A6%3A%22xxxxxx%22%3Bs%3A8%3A%22password%22%3Bs%3A6%3A%22xxxxxx%22%3Bs%3A5%3A%22isVip%22%3......
  • C. 在表格里造序列
    题意对于每一对满足\(1\lei,j\len\)的\((i,j)\),计算有多少个长度为\(m\)的序列,权值在\([1,n]\)之间且\(\gcd(a_1,a_2,...,a_m)=\gcd(i,j)\)。答案对\(998244353\)取模。思路方法:莫比乌斯反演+杜教筛不会莫比乌斯反演?出门右转:OI-wiki。不会杜教筛?出门右转:OI-wi......