C国演义 [第六章]

news2024/11/19 9:34:50

第六章

  • 最长递增子序列
    • 题目理解
    • 步骤
      • 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;
    }
};


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

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

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

相关文章

什么是http代理504网关超时错误,怎么处理

HTTP代理504网关超时错误是指代理服务器在尝试连接目标服务器时&#xff0c;等待目标服务器响应的时间超过了预设的时间&#xff0c;导致代理服务器无法返回请求结果给客户端&#xff0c;从而出现网关超时。 为什么会遇到http代理504网关超时错误 我们遇到HTTP代理504网关超时…

CSPM项目管理专业人员能力评价证书报考条件与考试形势

2021年10月&#xff0c;中共中央、国务院发布的《国家标准化发展纲要》明确提出构建多层次从业人员培养培训体系&#xff0c;开展专业人才培养培训和国家质量基础设施综合教育。建立健全人才的职业能力评价和激励机制。由中国标准化协会&#xff08;CAS&#xff09;组织开展的项…

【人工智能概论】 Python标准库——dalib(领域自适应)

【人工智能概论】 Python标准库——dalib&#xff08;领域自适应&#xff09; 文章目录 【人工智能概论】 Python标准库——dalib&#xff08;领域自适应&#xff09;一. 领域鉴别器&#xff08;DomainDiscriminator&#xff09;二. 领域对抗损失&#xff08;DomainAdversarial…

【MongoDB】五、MongoDB分片集群的部署

【MongoDB】五、MongoDB分片集群的部署 实验目的实验内容实验步骤环境准备部署 Config server配置Config Server副本集部署Shard部署mongos启动分片功能查看分片信息 实验小结 实验目的 能够通过部署MongoDB分片集群熟悉MongoDB分片集群架构和基本操作&#xff0c;从而解决大数…

调用有道API实现语音翻译(汉译英)

目录 1. 作者介绍2. 相关介绍2.1 API介绍2.2 网易API介绍 3. 实验过程3.1 调用过程3.2 代码获取3.3 完整代码 1. 作者介绍 南旭东&#xff0c;男&#xff0c;西安工程大学电子信息学院&#xff0c;2022级研究生 研究方向&#xff1a;机器视觉与人工智能 电子邮件&#xff1a;1…

win10 搭建vue环境并运行项目

win10 搭建vue环境并运行项目 1、参考链接2、遇到的问题及解决 1、参考链接 https://blog.csdn.net/qq_44959735/article/details/128886550 2、遇到的问题及解决 运行的时候不要再git bash里&#xff0c;要在自带的powershell里&#xff0c;以管理员权限运行。 问题&#xf…

未来5年,生产力的底层逻辑变了,影响所有企业

上周&#xff0c;K哥带领20多位企业家、技术高管参访了阿里钉钉&#xff0c;学习AI大模型如何应用到企业生产经营和组织管理当中&#xff0c;以及企业如何使用新生产力工具实现降本增效。 通过这次参访&#xff0c;我对AI大模型如何驱动企业管理变革有了新的认识&#xff0c;三…

js-排序数组中两个数字之和

给定一个已按照 升序排列 的整数数组 numbers &#xff0c;请你从数组中找出两个数满足相加之和等于目标数 target 。 函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numbers 的下标 从 0 开始计数 &#xff0c;所以答案数组应当满足 0 < answer[0] < answ…

【ArcGIS】栅格重分类(Reclass)

ArcGIS栅格重分类&#xff08;Reclass&#xff09; 1 重分类&#xff08;Relassify&#xff09;1.1 新值替代1.2 将值组合到一起1.3 按相同等级对一组栅格的值进行重分类1.4 将特定值设置为NoData或者为NoData像元设置某个值1.5 操作步骤 2 查找表&#xff08;Lookup&#xff0…

CS5366设计原理图|Type-C转HDMI2.0 4K60+USB3.0+PD3.1视频转换芯片应用电路图

CS5366Type-C转HDMI2.0的显示协议转换芯片, 内部集成了PD3.0及DSC decoder, 并能按客户需求配置成不同的功能组合&#xff0c; 是目前集成度与功耗更小的一颗芯片。 Type-C转HDMI2.0 4K60USB3.0PD3.1视频转换芯片应用电路图&#xff1a; CS5366系列符合USB电源传输规范3.0。CS…

C语言+单片机-内存分布详解,全网最全,值得收藏保存

目录 一、C语言内存分区 1. 代码区 2. 常量区 3. 全局(静态)区 4. 堆区(heap) 5. 栈区(stack) 二、STM32存储器分配 1. 随机存储器—RAM 2. 只读存储器—ROM 三、基于STM32代码验证 1. 详细代码如下 2. 运行结果如下 四、单片机中的内存分布 1.含义解释 2. 程序…

Makerbase CANable V2.0在Window系统使用

应用软件与固件 应用软件CANable V2.0CANable V1.0cangaroocandleLight/slcan(支持CAN FD)candleLight/slcan/cantactBUSMASTER V3.2.2candleLightcandleLight/pcan/cantactTSMastercandleLightcandleLight/pcan/cantactPCAN-Explorer 5、pcan view不支持pcancantactslcan(不支…

北理工软件工程基础考试要点

文章目录 前言题型分析概念部分大题部分数据流图和数据字典数据流图数据字典 前言 这篇文章就是针对北理工计科同学写的&#xff0c;这是精心筛选&#xff0c;针对老师最后一节课的重点以及题型写的笔记&#xff0c;保你一天速通软件工程基础这门课。 题型分析 闭卷 单选题…

SAP-ABAP-SM30自建表维护如何如何自动带出描述

文章目录 1 Requirement2 Process2.1 When you finish table maintainer , and create event .2.2 Create sub routine .2.3 Write code 3. Result4 Reference Document 1 Requirement The requirement is that we input MATNR and HKONT and get the description automatic .…

DDoS攻击原理是什么?

&#x1f482; 个人网站:【海拥】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 目录 前言DDoS攻击的原理DDo…

考研算法第28天:冒泡排序和简单选择排序 【排序】

算法介绍 冒泡排序就不需要多说了&#xff0c;大一就会的东西&#xff0c;所以这里就不多言了。记录一下y总对他的分析就是了 简单选择排序 每次循环遍历后面的元素&#xff0c;然后将最小的放到最前面&#xff1a;举个例子 第一次 如上图 第一次发现最小的元素是2就将位于第…

EPM创建报表时,子节点有数据但是父节点无数据的解决方案

目录 一、环境二、问题描述与分析三、解决方案1、确认HANA MDX是否启用2、确认BPC前端的TIME维是否正常维护3. 在SPRO中设置模型参数4、使用SE38执行程序UJHANA_REFRESH_VIR_CUBE刷新模型 一、环境 产品版本BWSAP BW/4HANA 2021BPCSAP BPC 2021 Version for SAP BW/4 HANAEPM1…

电力数据安全治理实践思路探讨

01电力数据安全实践背景 数字经济的快速发展根本上源自数据的高质量治理和高价值转化&#xff0c;近年来&#xff0c;国家层面相继推出促进数据高质量治理的政策法规&#xff0c;围绕加强数据安全保障、提高数据质量等方面&#xff0c;明确了相关规定和要求。作为重要数据持有者…

TC8:TCP_UNACCEPTABLE_05-09

TCP_UNACCEPTABLE_05: [listen] unacceptable ACK -> RST [listen] 目的 在LISTEN状态下的TCP接收到携带一个不可接受的ACK号的段,发送RST并且保持在相同的状态 在LISTEN状态下的TCP,只能接收到SYN消息,不能有ACK标志位和ACK号,如果有,就是不可接受的 测试步骤 Teste…

C++IO流和类型处理(13)

IO流 IO流包括 标准IO流&#xff0c;字符串流&#xff0c;文件流 标准IO流 基础使用 #include <iostream> //包括istream和ostream cin >> ----- 标准输入 cout<< ----- 标准输出 clog<< ----- 带缓冲区的标准错误 cerr<< ----- 不带缓冲…