【LeetCode】300.最长递增子序列

news2024/11/18 6:29:13

首先分析这个问题,以示例1为例。

已经求得最大递增子序列长度为4,而且该子序列中最后一个数为101,

那么一定存在一个数ai,使得ai以及ai之前的所有数组成的序列中,

最大递增子序列长度为3,而且该子序列中最后一个数为ai。 

我们记dp[ i ]为,从第0个数到第 i-1 个数所组成的序列中,最大递增子序列的长度。那么在示例1中,dp[ 0 ]=1;dp[ 1 ]=1;dp[ 2 ]=1;dp[ 3 ]=2;dp[ 4 ]=2;dp[ 5 ]=3;dp[ 6 ]=4;dp[ 7 ]=4.

示例2中,dp[ 0 ]=1;dp[ 1 ]=2;dp[ 2 ]=2;dp[ 3 ]=3;dp[ 4 ]=3;dp[ 5 ]=4.

可以看出dp[ i ]的值是依次以某种规律递增的。

但由于要求是严格递增的子序列,因此ai之前比ai大的数就不再纳入考虑。

综上所述,dp[ i ]的值可以这么确定:找到ai之前比它小的数ak,dp[ i ]=dp[ k ]+1,最后为了使dp[i]最大,就必须使dp[ k ]最大,因此要在ai之前的数里找到最大的dp[ k ],由此就得到了dp[ i ]。

class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        int dp[2510]={0};
        int len=nums.size();
        for(int i=0;i<len;++i)
        {
            dp[i]=1;
//子序列长度最小值是 1
            for(int j=0;j<i;++j)
//第二层循环的目的是找到nums[i]之前比它小的数nums[j],
//找到最大值dp[j]之后,dp[i]=dp[j]+1
//下面这种写法等效于上面的分析,不过省了一点代码
            {
                if(nums[j]<nums[i])
                dp[i]=max(dp[i],dp[j]+1);
            }
        }
        int MAX=0;
        for(int i=0;i<len;++i) MAX=max(MAX,dp[i]);
//这里需要遍历整个dp数组找出最大值,原因在下面
        return MAX;
    }
};

 需要注意的是:这种方法最后需要遍历一遍dp数组来找出最大值,因为如果给出的序列如下:

元素:1,3,6,7,9,4,10,5,6

编号:0   1    2    3    4   5    6     7    8

那么dp[ 6 ]=6,但是计算dp[ 5 ]时,由于6、7、9都比4大,因此只考虑了dp[ 5 ]=max(dp[ 5 ],dp[ 1 ]+1),而dp[ 1 ]=2,故dp[ 5 ]=3;这就导致计算dp[ 7 ]=max(dp[ 7 ],dp[ 5 ]+1)=4,同理dp[8]=5,如果直接输出dp[ len ],就错了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/789023.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux环境Arduino IDE中配置ATOM S3

linux选择ubuntu发行版。 硬件设备有多小呢&#xff1a; 功能超级强大。 之前的ROS1和ROS2案例已经全部移植完成并测试结束&#xff08;三轮纯人力校验&#x1f60e;&#xff09;。 官网文档信息非常非常好&#xff1a; https://docs.m5stack.com/zh_CN/quick_start/atoms3…

AI学习笔记一:软件和环境搭建

若该文为原创文章&#xff0c;转载请注明原文出处。 工欲善其事必先利其器。 一、环境説明 1、win10, 无CPU。 2、云服务器AutoDL 3、安装的软件&#xff1a;pyCharm(比较少用&#xff0c;所以不安装&#xff09; 4、环境&#xff1a;miniconda 二、miniconda 安装 1、…

List的各种排序

目录 Collections.sort对list进行排序 对象中某个属性进行排序 通过比较器进行比较 JAVA8特性Stream流进行排序 Stream升降序组合使用 Collections.sort对list进行排序 public static void main(String[] args) {List<Integer> list new ArrayList<>();list…

渗透测试流程

目录 前言&#xff1a; 渗透测试流程 1、先了解下渗透测试与入侵的最大区别 2、一般渗透测试流程 前言&#xff1a; 在软件开发中&#xff0c;渗透测试是一种非常重要的安全测试方法&#xff0c;它可以帮助我们更加全面地检测软件中的安全漏洞和风险。 渗透测试流程 1、…

I2C通讯EEPROM

1。对I2C写数据的时候&#xff0c;首先发一个停止信号&#xff0c;确保接下来发送新的数据保存至EEPROM。 2。发送起始信号 3。发送EEPROM设备地址 根据对应的EEPROM&#xff0c;规格书&#xff0c;以及线路图&#xff0c;发送地址。 根据线路图A0,A1,A2接地&#xff0c;表…

Vite多页面应用简单构建(Vite4.4.1)

目录 概述 配置多页面 步骤1&#xff1a;vite创建空vue项目 步骤2&#xff1a;创建子页面 步骤3&#xff1a;打包配置 完毕&#xff0c;测试 概述 此篇博客说明&#xff1a;使用Vite构建一个vue项目&#xff0c;并配置多页面应用。 目标&#xff1a;给新创建的项目配置…

26.垂直滚动板

垂直滚动板 html部分 <div class"slider-container"><div class"left-slide"><div style"background-color: red;">1</div><div style"background-color: aquamarine;">2</div><div style&q…

京东技术专家首推:Spring 微服务架构设计,GitHub 星标 128K

前言 本书提供了实现大型响应式微服务的实用方法和指导原则&#xff0c;并通过示例全面 讲解如何构建微服务。本书深入介绍了 Spring Boot、Spring Cloud、 Docker、Mesos 和 Marathon&#xff0c;还会教授如何用 Spring Boot 部署自治服务&#xff0c;而 无须使用重量级应用服…

8款常用系统镜像烧录软件

系统烧录软件是一种用于将操作系统或其他软件程序安装到嵌入式系统、嵌入式设备或存储设备中的工具。它通常用于将预先编译好的二进制文件或源代码烧录到硬件设备的非易失性存储器中&#xff0c;例如闪存芯片、EEPROM、EPROM或其他存储介质。系统烧录软件提供了一个便捷的方式&…

基于Java+SpringBoot+vue前后端分离海滨体育馆管理系统设计实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

selenium的三种等待方式(强制等待,隐式等待,显示等待)

目录 1.强制等待&#xff08;无条件等待&#xff09; 2.隐式等待 3.显示等待 有时候做自动化测试&#xff0c;需要进行等待&#xff0c;因为下一步的操作依赖于上一步的结果&#xff0c;但是程序执行的很快&#xff0c;有时候页面还未加载完成就进行了下一步的操作&#xff…

【数据挖掘】使用 LSTM 进行时间和序列预测

一、说明 每天&#xff0c;人类在执行诸如过马路之类的任务时都会做出被动预测&#xff0c;他们估计汽车的速度和与汽车的距离&#xff0c;或者通过猜测球的速度并相应地定位手来接球。这些技能是通过经验和实践获得的。然而&#xff0c;由于涉及众多变量&#xff0c;预测天气或…

网络安全 Day19-计算机网络基础知识04(网络协议)

计算机网络基础知识04&#xff08;网络协议&#xff09; 1. ARP1.1 ARP通讯原理1.2 arp欺骗1.3 ARP欺骗与预防1.4 排查ARP病毒 2. DHCP工作原理&#xff08;自动分配内网IP&#xff09;3. TCP协议三次握手、四次挥手原理4. DNS协议工作原理 1. ARP Linux查看arp&#xff1a;ar…

12.Netty源码之整体架构脉络

Netty 整体架构脉络 Netty 的逻辑处理架构为典型网络分层架构设计&#xff0c;共分为网络通信层、事件调度层、服务编排层&#xff0c;每一层各司其职。 网络通信层 网络通信层的职责是执行网络 I/O 的操作。它支持多种网络协议和 I/O 模型的连接操作。当网络数据读取到内核缓冲…

一分钟叫你怎样AI绘画 Vega Ai

先看效果图&#xff1a; 是不是也想自己去创造这样的图片呢&#xff0c;注意已经不需要自己画了&#xff01;&#xff01; Vega AI 简介 Vega AI是一款能够 文字生成图片、根据图片文字进行生成图片、条件生成图片 、根据多张图片训练出自己的风格&#xff0c;在风格广场选择…

使用 OpenCV 和 GrabCut 算法进行交互式背景去除

一、说明 我想&#xff0c;任何人都可以尝试从图像中删除背景。当然&#xff0c;有大量可用的软件或工具能够做到这一点&#xff0c;但其中一些可能很昂贵。但是&#xff0c;我知道有人使用窗口绘画3D魔术选择或PowerPoint背景去除来删除背景。 如果您是计算机视觉领域的初学者…

Linux系统知识1—Linux命令基础格式,什么是命令,命令行,ls命令入门,ls命令的参数和选项,-a,-l -h选项的使用及组合使用

一.什么是命令&#xff0c;命令行 &#xff0e;命令行&#xff1a;即 Linux 终端&#xff08; Terminal )&#xff0c;是一种命令提示符页面。以纯"字符"的形式操作系统&#xff0c;可以使用各种字符化命令对系统发出操作指令。 &#xff0e;命令&#xff1a;即 Lin…

【LangChain】检索器之上下文压缩

LangChain学习文档 【LangChain】检索器(Retrievers)【LangChain】检索器之MultiQueryRetriever【LangChain】检索器之上下文压缩 上下文压缩 LangChain学习文档 概要内容使用普通向量存储检索器使用 LLMChainExtractor 添加上下文压缩(Adding contextual compression with an…

数据结构基本概念及算法分析

文章目录 1. 数据结构基本概念1.1 基本概念和术语1.1.1 数据1.1.2 数据元素1.1.3 数据项1.1.4 数据对象1.1.5 数据结构 1.2 逻辑结构与物理结构1.2.1 逻辑结构(我们最需要关注的问题)1.2.2 物理机构 1.3 数据类型1.3.1 数据类型定义1.3.2 抽象数据类型 2. 算法分析2.1 算法的复…

【Python机器学习】实验02 线性回归

文章目录 线性回归1. 单变量的线性回归1.1 数据读取1.2 训练数据的准备1.3 假设函数定义--假设函数是为了去预测1.4 损失函数的定义1.5 利用梯度下降算法来优化参数w1.6 可视化误差曲线1.7 可视化回归线/回归平面 1.2 单变量的线性回归--基于sklearn试试&#xff1f;1.3 多变量…