「动态规划」如何求最长递增子序列的长度?

300. 最长递增子序列icon-default.png?t=N7T8https://leetcode.cn/problems/longest-increasing-subsequence/description/

给你一个整数数组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,-10^4 <= nums[i] <= 10^4。

进阶:你能将算法的时间复杂度降低到O(nlog(n))吗?


我们用动态规划的思想来解决这个问题。

确定状态表示:根据经验和题目要求,我们用dp[i]表示:以i位置为结尾的所有子序列中,最长递增子序列的长度

推导状态转移方程:以i位置为结尾的所有子序列分为2类:长度为1的子序列,长度大于1的子序列。如果子序列的长度是1,那么这个子序列是递增子序列。下面我们考虑长度大于1的子序列。

如果以i位置为结尾的子序列的长度大于1,我们可以继续细分为:i位置元素的前面是i - 1位置元素的子序列,i位置元素的前面是i - 2位置元素的子序列,i位置元素的前面是i - 3位置元素的子序列,……,i位置元素的前面是0位置元素的子序列。也就是说,如果子序列中,i位置元素的前面是j位置元素,那么j的范围是[0, i - 1]。

对于每一个j,如果nums[j] < nums[i],那么这个子序列就有可能是递增子序列。要想这个子序列尽可能得长,就要找到以j位置为结尾的最长递增子序列,在这个子序列后面添加nums[i],即为以i位置为结尾的最长递增子序列。

综上所述,dp[i]应该取:「1」和「所有满足0 <= j < i并且nums[j] < nums[i]的j中,最大的dp[j]加1」的较大值。

所以,我们可以把dp表的值都初始化为1,其中dp[0] = 1是显然的。如果i > 0,那么dp[i]就应该取:所有满足0 <= j < i并且nums[j] < nums[i]的j中,最大的dp[j]加1

填表顺序:根据状态转移方程,显然应从左往右填表

返回值:根据状态表示,应返回dp表的最大值

细节问题:dp表的规模和nums相同,均为1 x n

class Solution {
public:int lengthOfLIS(vector<int>& nums) {int n = nums.size();// 创建dp表vector<int> dp(n, 1);// 填表for (int i = 1; i < n; i++) {for (int j = 0; j < i; j++) {if (nums[j] < nums[i]) {dp[i] = max(dp[i], dp[j] + 1);}}}return *max_element(dp.begin(), dp.end());}
};

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Apache Flink实现实时数据同步与清洗:MySQL和Oracle到目标MySQL的ETL流程

使用Apache Flink实现实时数据同步与清洗&#xff1a;MySQL和Oracle到目标MySQL的ETL流程 实现数据同步的ETL&#xff08;抽取、转换、加载&#xff09;过程通常涉及从源系统&#xff08;如数据库、消息队列或文件&#xff09;中抽取数据&#xff0c;进行必要的转换&#xff0…

2024最新版Node.js下载安装及环境配置教程(非常详细)

一、进入官网地址下载安装包 官网&#xff1a;Node.js — Run JavaScript Everywhere 其他版本下载&#xff1a;Node.js — Download Node.js (nodejs.org) 选择对应你系统的Node.js版本 二、安装程序 &#xff08;1&#xff09;下载完成后&#xff0c;双击安装包&#xf…

Go的GUI Fyne开发环境搭建—Windows 11

安装go 到官网下载安装go安装包 https://go.dev/learn/ 通过如下命令检验安装是否成功&#xff0c;出现版本号则安装成功 go version安装国内go依赖包代理 go env -w GOPROXYhttps://goproxy.cn安装gcc编译器 直接用官网提供的安装建议第二条&#xff0c;到这个地址进行下载…

二刷算法训练营Day41 (Day40休息) | 动态规划(3/17)

目录 详细布置&#xff1a; 1. 背包问题理论基础 1.1 01背包 2. 46. 携带研究材料&#xff08;第六期模拟笔试&#xff09; 一维dp数组&#xff08;滚动数组&#xff09; 3. 416. 分割等和子集 详细布置&#xff1a; 1. 背包问题理论基础 但说实话&#xff0c;背包九讲…

C#开发-集合使用和技巧(六)特殊转换方法SelectMany的介绍和用法

C#开发-集合使用和技巧&#xff08;六&#xff09; 特殊转换方法SelectMany的介绍和用法 介绍使用示例Select与SelectMany对比特殊情况 介绍 SelectMany 方法在C#中用于将集合中的元素转换为其他类型的集合&#xff0c;并将这些集合扁平化为一个单一的序列。它是LINQ的一部分…

Unity URP下通过相机让部分Render不受后处理渲染

我们有时候不想某些对象受到后处理影响&#xff0c;找到了这样一个决绝办法&#xff0c;通过增加一个Overlay相机只照射这个模型来实现&#xff0c;下面看看如何实现。 第一步 首先我们拖一个测试场景&#xff0c;有如下一些元素 一个盒子&#xff0c;以后后处理&#xff0c…

Python武器库开发-武器库篇之ThinkPHP6 多语言本地文件包含漏洞(六十七)

Python武器库开发-武器库篇之ThinkPHP6 多语言本地文件包含漏洞&#xff08;六十七&#xff09; 漏洞环境搭建 这里我们使用Kali虚拟机安装docker并搭建vulhub靶场来进行ThinkPHP漏洞环境的安装&#xff0c;我们进入 ThinkPHP漏洞环境&#xff0c;可以 cd ThinkPHP&#xff0…

【Solr 学习笔记】Solr 源码启动教程

Solr 源码启动教程 本教程记录了如何通过 IDEA 启动并调试 Solr 源码&#xff0c;从 Solr9 开始 Solr 项目已由 ant 方式改成了 gradle 构建方式&#xff0c;本教程将以 Solr 9 为例进行演示&#xff0c;IDE 选择使用 IntelliJ IDEA。 Solr github 地址&#xff1a;https://gi…

【机器学习】机器学习重要方法——深度学习:理论、算法与实践

文章目录 引言第一章 深度学习的基本概念1.1 什么是深度学习1.2 深度学习的历史发展1.3 深度学习的关键组成部分 第二章 深度学习的核心算法2.1 反向传播算法2.2 卷积神经网络&#xff08;CNN&#xff09;2.3 循环神经网络&#xff08;RNN&#xff09; 第三章 深度学习的应用实…

AI交互及爬虫【数据分析】

各位大佬好 &#xff0c;这里是阿川的博客&#xff0c;祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 Python 初阶 Python–语言基础与由来介绍 Python–…

区块链实验室(37) - 交叉编译百度xuperchain for arm64

纠结了很久&#xff0c;终于成功编译xuperchain for arm64。踩到1个坑&#xff0c;说明如下。 1、官方文档是这么说的&#xff1a;go语言版本推荐1.5-1.8 2、但是同一个页面&#xff0c;又是这么说的&#xff1a;不推荐使用1.11之前的版本。 3、问题来了&#xff1a;用什么版本…

2024年特种设备(门式起重机司机)考试真题题库。

181."ZZ"表示钢丝绳为&#xff08; &#xff09;。 A.右同向捻 B.左同向捻 C.右交互捻 D.左交互捻 答案:A 182.桥式起重机的金属结构主要由起重机桥架&#xff08;又称大车桥架&#xff09;、&#xff08; &#xff09;和操纵室&#xff08;司机室&#xff09;…

提升工作效率的实体和虚拟工具推荐

在现代工作中&#xff0c;我们常常需要利用各种工具来提高工作效率。本文将介绍一款实体工具和一款虚拟工具&#xff0c;它们都能够有效地提升工作效率&#xff0c;让我们更高效地完成任务。 实体工具&#xff1a;金鸣表格文字识别大师 金鸣表格文字识别大师是一款优秀的文字识…

Day 32:503. 下一个更大的元素Ⅱ

Leetcode 503. 下一个更大的元素Ⅱ 给定一个循环数组 nums &#xff08; nums[nums.length - 1] 的下一个元素是 nums[0] &#xff09;&#xff0c;返回 nums 中每个元素的 下一个更大元素 。 数字 x 的 下一个更大的元素 是按数组遍历顺序&#xff0c;这个数字之后的第一个比它…

Ltv 数据粘包处理

测试数据包的生成 校验程序处理结果和原始的日志保温解析是否一致 程序粘包分解正常

【NPS】哑终端设备如何实现域VLAN动态分配

在【NPS】微软NPS配置802.1x&#xff0c;验证域账号&#xff0c;动态分配VLAN&#xff08;有线网络续篇&#xff09;中&#xff0c;已经通过C3PL策略配置实现了802.1x验证没有通过时&#xff0c;自动分配一个Guest VLAN&#xff0c;以确保用户至少能够访问基本的网络服务。问题…

mysql学习——SQL中的DQL和DCL

SQL中的DQL和DCL DQL基本查询条件查询聚合函数分组查询排序查询分页查询 DCL管理用户权限控制 学习黑马MySQL课程&#xff0c;记录笔记&#xff0c;用于复习。 DQL DQL英文全称是Data Query Language(数据查询语言)&#xff0c;数据查询语言&#xff0c;用来查询数据库中表的记…

Windows资源管理器down了,怎么解

ctrlshiftesc 打开任务管理器 文件 运行新任务 输入 Explorer.exe 资源管理器重启 问题解决 桌面也回来了

java基于ssm+jsp 美好生活日志网

1前台首页功能模块 九宫格日志网站&#xff0c;在系统首页可以查看首页、日记信息、美食信息、景点信息、新闻推荐、日志展示、论坛信息、新闻资讯、留言反馈、我的、跳转到后台等内容&#xff0c;如图1所示。 图1前台首页功能界面图 用户注册&#xff0c;在用户注册页面可以填…

MySQL----undo log回滚日志原理、流程以及与redo log比较

回滚日志 回滚日志&#xff0c;保存了事务发生之前的数据的一个版本&#xff0c;用于事务执行时的回滚操作&#xff0c;同时也是实现多版本并发控制&#xff08;MVCC&#xff09;下读操作的关键技术。 如何理解Undo Log 事务需要保证原子性&#xff0c;也就是事务中的操作要…