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;
}
};

LeetCode300.最长递增子序列的更多相关文章

  1. LeetCode--300. 最长递增子序列

    题目:给定一个无序的整数数组,找到其中最长上升子序列的长度. 示例: 输入: [10,9,2,5,3,7,101,18] 输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4 ...

  2. leetcode300. Longest Increasing Subsequence 最长递增子序列 、674. Longest Continuous Increasing Subsequence

    Longest Increasing Subsequence 最长递增子序列 子序列不是数组中连续的数. dp表达的意思是以i结尾的最长子序列,而不是前i个数字的最长子序列. 初始化是dp所有的都为1 ...

  3. (转载)最长递增子序列 O(NlogN)算法

    原博文:传送门 最长递增子序列(Longest Increasing Subsequence) 下面我们简记为 LIS. 定义d[k]:长度为k的上升子序列的最末元素,若有多个长度为k的上升子序列,则 ...

  4. 最长公共子序列(LCS)和最长递增子序列(LIS)的求解

    一.最长公共子序列 经典的动态规划问题,大概的陈述如下: 给定两个序列a1,a2,a3,a4,a5,a6......和b1,b2,b3,b4,b5,b6.......,要求这样的序列使得c同时是这两个 ...

  5. 最长递增子序列 O(NlogN)算法

    转自:点击打开链接 最长递增子序列,Longest Increasing Subsequence 下面我们简记为 LIS. 排序+LCS算法 以及 DP算法就忽略了,这两个太容易理解了. 假设存在一个 ...

  6. 51nod 1134 最长递增子序列

    题目链接:51nod 1134 最长递增子序列 #include<cstdio> #include<cstring> #include<algorithm> usi ...

  7. 动态规划 - 最长递增子序列(LIS)

    最长递增子序列是动态规划中经典的问题,详细如下: 在一个已知的序列{a1,a2,...,an}中,取出若干数组组成新的序列{ai1,ai2,...,aim},其中下标i1,i2,...,im保持递增, ...

  8. 最长递增子序列问题 nyoj 17单调递增最长子序列 nyoj 79拦截导弹

    一,    最长递增子序列问题的描述 设L=<a1,a2,…,an>是n个不同的实数的序列,L的递增子序列是这样一个子序列Lin=<aK1,ak2,…,akm>,其中k1< ...

  9. 2.16 最长递增子序列 LIS

    [本文链接] http://www.cnblogs.com/hellogiser/p/dp-of-LIS.html [分析] 思路一:设序列为A,对序列进行排序后得到B,那么A的最长递增子序列LIS就 ...

  10. 【动态规划】拦截导弹_dilworth定理_最长递增子序列

    问题 K: [动态规划]拦截导弹 时间限制: 1 Sec  内存限制: 256 MB提交: 39  解决: 10[提交][状态][讨论版] 题目描述 张琪曼:“老师,修罗场是什么?” 墨老师:“修罗是 ...

随机推荐

  1. 高通平台抓ram dump

    高通平台抓ram dump 原文(有删改):https://blog.csdn.net/m0_37166404/article/details/80821600 背景 高通平台下提供了一个工具,专门用 ...

  2. OPC 详解 第一篇 基础概念

    一 .概述 OPC 的全称是OPC(OLE for Process Control), 用于过程控制的OLE,OLE(Object Linking and Embedding)大家都知道是对象连接与嵌 ...

  3. 面试官:Java线程可以无限创建吗?

    哈喽,大家好,我是世杰. 本次给大家介绍一下操作系统线程和Java的线程以及二者的关联 1. 面试连环call Java线程可以无限创建吗? Java线程和操作系统线程有什么关联? 操作系统为什么要区 ...

  4. node.js 增删改查(原始)

    index.js  连接数据库 const mongoose = require('mongoose') //数据库连接27017是mongodb数据库的默认端口 mongoose.connect(' ...

  5. SpringBoot整合Flyway数据库版本管理

    项目结构 添加依赖 <dependency> <groupId>org.flywaydb</groupId> <artifactId>flyway-co ...

  6. Mybatis 快速入门(注解方式)

    导读 注解开发的方式只需要程序员开发Mapper接口即可,不需要编写映射文件(XML). 环境搭建 项目结构 SqlMapConfig.xml <!DOCTYPE configuration P ...

  7. 【原创软件】第7期:文件夹生成器V1.0-按照列表批量生成文件夹,简单小巧

    一.背景 因为工作需要,需要批量创建文件夹.为了省去人工创建时间,使用aardio制作了一个软件. 二.功能演示 三.下载地址  https://www.123pan.com/s/9Rn9-1xppH ...

  8. Arctic开源!网易数帆×华泰证券,推动湖仓一体落地

    数字化转型趋势下,各行业对数据生产力的探索与追求逐步进入深水区.现实的问题是,企业数据仓库存储.数据湖多种技术并存的局面将长期存在,如何才能摆脱技术协同的内耗,让大数据直通生产力的彼岸? 8月11日下 ...

  9. 玄机-第一章 应急响应-Linux日志分析

    目录 前言 简介 应急开始 准备工作 查看auth.log文件 grep -a 步骤 1 步骤 2 步骤 3 步骤 4 步骤 5 总结 前言 又花了一块rmb玩玄机...啥时候才能5金币拿下一个应急靶 ...

  10. thinkphp5 关于跨域的一些坑

    1.首先在tp5的入口文件:public/index.php 在里面添加三行: // [ 应用入口文件 ] header("Access-Control-Allow-Origin:*&quo ...