C国演义 [第六章]

第六章

  • 最长递增子序列
    • 题目理解
    • 步骤
      • dp含义
      • 递推公式
      • 初始化
      • 遍历顺序
    • 代码
  • 最长连续递增序列
    • 题目理解
    • 步骤
      • dp含义
      • 递推公式
      • 初始化
      • 遍历顺序
    • 代码

最长递增子序列

力扣链接

给你一个整数数组 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含义

dp[i] — — 以nums[i]结尾的最长递增子序列的最大长度

🗨️为什么是以nums[i]结尾??

  • 我们在做递增比较时, 一定会比较 nums[i] 和 nums[j] ( j的区间是 [0, i - 1] ),
    那么两个递增子序列一定是以 nums[i] 和 nums[j] 结尾的
    如果不是比较结尾元素, 那么递增就没有意义啦

递推公式

递增比较区间是 [0, i - 1]
递增比较条件是 num[i] > nums[j] (j 的区间是 [0, i - 1])
由于是一个区间, 那么就要在区间里面取一个最大值

if(nums[i] > num[j])
	dp[i] = max(dp[i], dp[j] + 1);

举个例子:
nums = [1, 3, 7, 5, 9, 6 ], nums[i] = 9:
j 遍历到 1, 9 > 1, dp[4] = max(dp[4], dp[0] + 1) = max(1, 2) = 2
j 遍历到 3, 9 > 3, dp[4] = max(dp[4], dp[1] + 1) = max(2, 3) = 3
j 遍历到 7, 9 > 7, dp[4] = max(dp[4], dp[2] + 1) = max(3, 4) = 4
j 遍历到 5, 9 > 5, dp[4] = max(dp[4], dp[3] + 1) = max(4, 4) = 4

初始化

🗨️由递推公式得知: 都是从dp[0] 推导上去的, dp[0] 该怎样初始化呢?

  • 回顾一下dp的含义 — — 以nums[i]结尾的最长递增子序列的长度
    那么dp[0] — — 以nums[0]结尾的最长递增子序列的长度 — — 那么dp[0] = 1

🗨️那么其他的应该怎样初始化?

  • 每一个数, 都是一个递增子序列 — — 其他的也应该初始化为 1

dp数组都初始化为1

遍历顺序

由递推公式得知: 是由前到后的顺序
那么遍历顺序就是, 从小到大

代码

class Solution {
public:
    int lengthOfLIS(vector<int>& nums) 
    {
        // 初始化
        // dp[i] -- -- 以dp[i]结尾的最长递增子序列的最大长度
        vector<int> dp(nums.size(), 1);
        
        int result = 1;  // 记录最长递增子序列的最大长度
                        // 初始化为 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[j] + 1, dp[i]);
            }
            
            result = max(result, dp[i]);
        }
        
        return result;
    }
};

最终的结果并不是 dp[nums.size() - 1],
而是需要遍历dp[i], 然后找到一个最大值

举个例子:
nums = [1, 3, 5, 7, 6 ], 我们发现: 最长递增子序列是 1, 3, 5, 7
是以 7结尾的, 而不是以 6结尾的

最长连续递增序列

力扣链接

给定一个未经排序的整数数组,找到最长且 连续递增的子序列,并返回该序列的长度。
连续递增的子序列 可以由两个下标 l 和 r(l < r)确定,如果对于每个 l <= i < r,都有 nums[i] < nums[i + 1] ,那么子序列 [nums[l], nums[l + 1], …, nums[r - 1], nums[r]] 就是连续递增子序列。

示例 1:
输入:nums = [1,3,5,4,7]
输出:3
解释:最长连续递增序列是 [1,3,5], 长度为3。
尽管 [1,3,5,7] 也是升序的子序列, 但它不是连续的,因为 5 和 7 在原数组里被 4 隔开。
示例 2:
输入:nums = [2,2,2,2,2]
输出:1
解释:最长连续递增序列是 [2], 长度为1。

  • 提示:
    1 <= nums.length <= 104
    -109 <= nums[i] <= 109

题目理解

这个题目跟上个题目的思路是一样的, 但是有个区别就是 连续 && 递增
上个题目只要求 递增即可
那么这个时候, 就简单很多:
递增子序列 — — 需要在 [0, i - 1] 中比较, 找出最大值
连续递增子序列 ---- — 仅仅只需要 dp[i - 1]的情况

步骤

dp含义

dp[i] — — 以nums[i]结尾的最长连续递增子序列的长度

递推公式

连续 — — nums[i] > nums[i - 1]
那么递推公式就如下:

if(nums[i] > nums[i - 1]) 
	dp[i] = dp[i - 1] + 1;

初始化

🗨️由递推公式得知: 都是从dp[0] 推导上去的, dp[0] 该怎样初始化呢?

  • 回顾一下dp的含义 — — 以nums[i]结尾的最长递增子序列的长度
    那么dp[0] — — 以nums[0]结尾的最长递增子序列的长度 — — 那么dp[0] = 1

🗨️那么其他的应该怎样初始化?

  • 每一个数, 都是一个递增子序列 — — 其他的也应该初始化为 1

dp数组都初始化为1

遍历顺序

由递推公式得知: 是从前到后的遍历顺序
那么就是 从小到大的遍历顺序

代码

class Solution {
public:
    int findLengthOfLCIS(vector<int>& nums) 
    {
        vector<int> dp(nums.size(), 1);
        
        int result = 1;
        for(int i = 1; i < nums.size(); i++)
        {
            if(nums[i] > nums[i - 1])
                dp[i] = dp[i - 1] + 1;
            
            result = max(result, dp[i]);
        }
        
        return result;
    }
};


饭能够一日不吃,觉能够一日不睡,书不能够一日不读 — — 毛泽东

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux->线程同步

目录 前言&#xff1a; 1 线程同步引入 2 条件变量 2.1 线程饥饿 2.2 条件变量接口 2.3 添加条件变量 3 生产者和消费者模型 前言&#xff1a; 本篇主要讲解了关于线程同步的相关知识&#xff0c;还有生产者和消费者模型的认识和使用。 1 线程同步引入 在讲解线程同步之…

数仓架构“瘦身”,Hologres 5000CU时免费试用

Hologres基于创新的HSAP架构&#xff0c;可以将您原先数仓架构中的OLAP系统&#xff08;Greenplum、Presto、Impala、ClickHouse&#xff09;、KV数据库/Serving系统&#xff08;HBase、Redis&#xff09;统一在一个大数据计算引擎中&#xff0c;并提供快速的离线实时一体化分析…

智能家居APP软件开发有何优势?

传统家居行业营销模式已经无法满足现代人多样化个性化的需求&#xff0c;也跟不上互联网时代的发展步伐了&#xff0c;很多传统家居行业都陷入了营销困境。通过智能家居APP软件开发&#xff0c;可以利用互联网改造传统模式&#xff0c;探索新的发展模式&#xff0c;可以说智能家…

近期煤矿事故及电力综合自动化系统的介绍

安科瑞虞佳豪 5月29日&#xff0c;山西灵石红杏鑫鼎泰煤业有限公司发生一起死亡1人的安全事故&#xff1b;5月24日&#xff0c;山西华阳集团新能股份有限公司二矿发生一起死亡1人的安全事故。 ​山西省应急管理厅、山西省地方煤矿安全监督管理局责令山西灵石红杏鑫鼎泰煤业有…

【设计模式与范式:总结型】74 | 总结回顾23种经典设计模式的原理、背后的思想、应用场景等

到今天为止&#xff0c;23 种经典的设计模式已经全部讲完了。咱们整个专栏也完成了 3/4&#xff0c;马上就要进入实战环节了。在进入新模块的学习之前&#xff0c;我照例带你做一下总结回顾。23 种经典设计模式共分为 3 种类型&#xff0c;分别是创建型、结构型和行为型。今天&…

经典的设计模式21——策略模式

文章目录 策略模式 猛的发现策略模式和状态模式的结构图长得到好像&#xff0c;可得好好区分区分。 不过真的好像&#xff0c;就是方法那里传递的参数不一样。 百度来一波。 策略模式 定义&#xff1a; 定义了算法家族&#xff0c;分别封装起来&#xff0c;让他们之间可以互…

智能无线监测器的工作原理及应用优势

在现代工业生产中&#xff0c;设备状态监测对于确保生产的安全性、效率和可靠性至关重要。随着科技的不断发展&#xff0c;智能无线监测器成为工业设备状态监测的利器。本文将介绍智能无线监测器在工业领域中的应用&#xff0c;以及其带来的优势和价值。 图.设备状态监测&#…

TypeScript ~ 掌握基本类型 ②

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; TypeScript ~ TS &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &…

SKD240

SKD240 系列智能电力仪表 SKD240 系列智能电力仪表是陕西斯科德智能科技有限公司自主研发、生产的。 产品概述 - 点击了解详情 SKD240采用先进的微处理器和数字信号处理技术&#xff08;内置主芯片采用32位单片机, 采用32位浮点型真有效值处理数据&#xff09;&#xff0c;测量…

南卡OE骨传导开放式蓝牙耳机评测!舒适与音质并存!

平时买耳机的时候&#xff0c;你最先会关注什么方向呢&#xff1f;是舒适、美观&#xff0c;还是音质、防水&#xff1f; 对于我来说&#xff0c;首先是功能。作为一个经常健身、跑步的人&#xff0c;最讨厌的就是平时运动流汗进入耳朵之后那种粘腻感觉。时间长了还容易让耳道…

Windows安装postgresql数据库图文教程

数据库使用排行榜&#xff1a;https://db-engines.com/en/ranking 目录 一、软件简介 二、软件下载 三、安装教程 四、启动教程 一、软件简介 PostgreSQL是一种特性非常齐全的自由软件的对象-关系型数据库管理系统&#xff08;ORDBMS&#xff09;&#xff0c;是以加州大学计…

Postman快速入门(一)

一、基本介绍 postman是一款流程的接口调试工具&#xff0c;其特点就是使用简单&#xff0c;功能强大。使用角色也非常广泛&#xff0c;后端开发&#xff0c;前端人员&#xff0c;测试人员都可以使用它进行接口调试或测试。 下图是基本功能介绍 发送第一个请求 如果你是第一次…

免费在线压缩图片的网站

1. TinyPNG - 这是一个非常受欢迎的在线图片压缩网站,可以压缩 PNG 和 JPG 图片,保证无损压缩。 网址&#xff1a;TinyPNG – Compress WebP, PNG and JPEG images intelligently 2. Compressor.io - 这也是一个很好的在线图片压缩工具,可以批量上传和压缩图片,支持 PNG, JPG 和…

安卓进阶(一)App性能优化

文章目录 性能优化的目的及方向流畅性启动速度页面显示速度响应速度 稳定性ANRCrash 资源节省性 布局优化选择耗费性能较少的布局减少布局的层级&#xff08;嵌套&#xff09;使用布局标签尽量少用布局属性wrap_contentincludemergeinclude与merge的区别ViewStub 内存泄露常见内…

前沿技术|人工智能的崛起和发展历程

前言&#xff1a; 人工智能的作用是使计算机能够模仿人类智能和学习能力&#xff0c;从而实现自动化、智能化和优化决策的目标。 文章目录 人工智能背景介绍发展状态未来展望 总结 人工智能 背景 人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09;的产生…

多模态大模型综述: LLaVA, MiniGPT4

文章目录 LLaVA一. 简介1.1. 摘要1.2. 引言 二. 相关工作三. 基于GPT辅助的视觉指令数据生成四. Visual Instruction Tuning4.1 网络结构4.2 训练 LLaVA 一. 简介 题目: Visual Instruction Tuning 机构&#xff1a;微软 论文: https://arxiv.org/pdf/2304.08485.pdf 代码&am…

大数据大作业(课程设计)

题目&#xff1a;信息爬取字数统计及可视化 内容及要求&#xff1a; 配置Hadoop平台&#xff1b;利用爬虫技术爬取任一门户网站新闻栏目一定时间段内的新闻信息&#xff0c;保存为一个或多个文件并上传到Hadoop平台以本人学号命名的文件夹下&#xff1b;利用MapReduce框架编程完…

【java】JDK21 要来了

文章目录 前言更丝滑的并发编程模式虚拟线程&#xff08;Virtual Threads&#xff09;结构化并发&#xff08;Structured Concurrency&#xff09;作用域值&#xff08;Scoped Values&#xff09; 试验一下虚拟线程的例子结构化编程的例子Scoped Values 的例子 前言 不过多久&…

大数据分析案例-基于LightGBM算法构建航空公司满意度预测模型

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

Nexus搭建Maven私有库介绍

为什么需要Maven私有库&#xff1f; 使用Maven获取Java依赖包的时候&#xff0c; 默认是从Maven的中央库下载 jar文件&#xff0c; 中央库的地址是&#xff1a; https://repo.maven.apache.org/maven2 。 如果下载速度慢&#xff0c; 可以使用阿里的镜像&#xff0c; 地址如下…