第九章 动态规划 part13 300. 最长递增子序列 674. 最长连续递增序列 718. 最长重复子数组

news2024/11/26 19:50:02

第五十二天| 第九章 动态规划 part13 300. 最长递增子序列 674. 最长连续递增序列 718. 最长重复子数组

一、300. 最长递增子序列

  • 题目链接:https://leetcode.cn/problems/longest-increasing-subsequence/

  • 题目介绍:

    • 给你一个整数数组 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 。
      
  • 思路:

    • (1)确定dp数组及下标含义:

      • dp[i]:表示的是以nums[i]结尾的最长递增子序列的长度
        
    • (2)确定递推公式:

      • 递推公式:对比nums[i]和以下标从0到i-1的nums[j],如果nums[i] > nums[j],那么dp[i] = Math.max(dp[j] + 1, dp[i])。这里和dp[i]求最大值目的是求出从下标0到i-1的所有的dp[j] + 1的最大值。
        
    • (3)初始化dp数组:

      • 根据dp数组的含义,dp数组的每一个值初始化为1,因为最起码当前这个值可以作为递增子序列。
        
    • (4)确定遍历顺序:

      • 正序
  • 代码:

class Solution {
    public int lengthOfLIS(int[] nums) {
        if (nums == null || nums.length == 0) return 0;
        // (1)确定dp数组及下标含义:
        // dp[i]:表示的是以nums[i]结尾的最长递增子序列的长度
        int[] dp = new int[nums.length];
        // (3)初始化dp数组
        // 根据dp数组的含义,dp数组的每一个值初始化为1,因为最起码当前这个值可以作为递增子序列。
        Arrays.fill(dp, 1);
        // (4)确定遍历顺序:
        // 后面的值是由前面确定的,因此是正序遍历
        int result = 1;
        for (int i = 1; i < nums.length; i++) {
            // (2)确定递推公式:
        	// 递推公式:对比nums[i]和以下标从0到i-1的nums[j],如果nums[i] > nums[j],那么dp[i] = Math.max(dp[j] + 1, dp[i])。这里和dp[i]求最大值目的是求出从下标0到i-1的所有的dp[j] + 1的最大值。
            for (int j = 0; j < i; j++) {
                if (nums[i] > nums[j]) dp[i] = Math.max(dp[j] + 1, dp[i]);
            }
            // 注意:惯性思维,在dp问题中,我们会认为最终最优结果是dp[nums.length - 1],但本题不是。根据dp数组的含义,我们要找的最终结果是dp数组中最大的那个值。
            if (dp[i] > result) result = dp[i];
        }
        return result;
    }
}

二、674. 最长连续递增序列

  • 题目链接:https://leetcode.cn/problems/longest-continuous-increasing-subsequence/

  • 题目介绍:

    • 给定一个未经排序的整数数组,找到最长且 连续递增的子序列,并返回该序列的长度。

      连续递增的子序列 可以由两个下标 lrl < 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 隔开。 
      
  • 思路:

    • (1)确定dp数组及下标含义:

      • dp[i]:表示的是以nums[i]为结尾的最长连续递增序列
        
    • (2)确定递推公式:

      • 与上一题不同的地方在于,本题要求的必须是连续的,因此dp[i]只能由dp[i-1] + 1得出
        
    • (3)初始化dp数组:

      • 仍然全部初始化为1
        
    • (4)确定遍历顺序:

      • 正序
  • 代码:

class Solution {
    public int findLengthOfLCIS(int[] nums) {
        if (nums == null || nums.length == 0) return 0;
        // (1)确定dp数组及下标含义:
        // dp[i]:表示的是以nums[i]为结尾的最长连续递增序列
        int[] dp = new int[nums.length];
        // (3)初始化dp数组:
        // 仍然全部初始化为1
        Arrays.fill(dp, 1);
        int result = 1;
        // (4)确定遍历顺序:
        // 正序遍历
        for (int i = 1; i < nums.length; i++) {
            // (2)确定递推公式:
            // 与上一题不同的地方在于,本题要求的必须是连续的,因此dp[i]只能由dp[i-1] + 1得出
            if (nums[i] > nums[i-1]) dp[i] = dp[i-1] + 1;
            if (dp[i] > result) result = dp[i];
        }
        return result;
    }
}

三、718. 最长重复子数组

  • 题目链接:https://leetcode.cn/problems/maximum-length-of-repeated-subarray/

  • 题目介绍:

    • 给两个整数数组 nums1nums2 ,返回 两个数组中 公共的 、长度最长的子数组的长度

      示例 1:

      输入:nums1 = [1,2,3,2,1], nums2 = [3,2,1,4,7]
      输出:3
      解释:长度最长的公共子数组是 [3,2,1] 。
      
  • 思路:

    • (1)确定dp数组及下标的含义:

      • dp[i][j]:表示的是以下标i-1为结尾的nums1和以下标j-1为结尾的nums2的最长重复子数组的长度。
        
      • 为什么要定义为i-1和j-1呢?是因为初始化的时候便于初始化,在初始化的部分再详细解释

    • (2)确定递推公式:

      • 因为求得的是重复子数组的最大长度,因此dp[i][j]应该由nums1的i-1位和nums2的i-2位推导出来,即二维数组的左斜上角
      • 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
    • (3)dp数组初始化:

      • 全部初始化为0,这里主要强调的是dp[i][0]和dp[0][j]这一列一行,这一列一行根据dp数组的含义是没有任何意义的,所以初始化为0。但如果本题dp数组含义改为...i...j,那么第一列和第一行就要根据是否重复设定为1,会复杂一些。因此定义dp数组的含义为...i-1...j-1
        
    • (4)遍历顺序:

      • 两层for循环,从下标1开始,正序遍历
  • 代码:

class Solution {
    public int findLength(int[] nums1, int[] nums2) {
        int result = 0;
        // (1)确定dp数组及下标的含义:
        // dp[i][j]:表示的是以下标i-1为结尾的nums1和以下标j-1为结尾的nums2的最长重复子数组的长度。
        // 为什么要定义为i-1和j-1呢?是因为初始化的时候便于初始化,在初始化的部分再详细解释
        int[][] dp = new int[nums1.length + 1][nums2.length + 1];
        // (3)dp数组初始化:
        // 全部初始化为0,这里主要强调的是dp[i][0]和dp[0][j]这一列一行,这一列一行根据dp数组的含义是没有任何意义的,所以初始化为0。但如果本题dp数组含义改为...i...j,那么第一列和第一行就要根据是否重复设定为1,会复杂一些。因此定义dp数组的含义为...i-1...j-1
        // (4)遍历顺序:
        // 两层for循环,从下标1开始,正序遍历
        for (int i = 1; i <= nums1.length; i++) {
            for (int j = 1; j <= nums2.length; j++) {
                // (2)确定递推公式:
        		// 因为求得的是重复子数组的最大长度,因此dp[i][j]应该由nums1的i-1位和nums2的i-2位推导出来,即二维数组的左斜上角
                if (nums1[i-1] == nums2[j-1]) dp[i][j] = dp[i-1][j-1] + 1;
                if (dp[i][j] > result) result = dp[i][j];
            }
        }
        return result;
    }
}

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

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

相关文章

xilinx的原语的使用

xilinx的原语的使用 在学习FPGA实现千兆网时需要GMII转RGMII&#xff0c;这就涉及了原语的使用&#xff0c;特此记录&#xff01; 一、原语 与RGMII接口相关的原语&#xff1a; BUFG:全局时钟网络 BUFIO&#xff1a;只能采集IO的数据&#xff0c;采集IO数据的时候延时是最低的…

力扣-169. 多数元素(C语言+分治递归)

1. 题目 给定一个大小为 n 的数组 nums &#xff0c;返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 2. 输入输出样例 示例1 输入&#xff1a;nums [3,2,3] 输出&#xff…

指定vscode黏贴图片路径(VSCode 1.79 更新)

指定vscode黏贴图片路径(VSCode 1.79 更新) 设置中搜索"markdown.copyFiles.destination" 点击AddItem,配置你的key-value&#xff0c;完成。

VUE2项目:尚品汇-axios二次封装请求以及VUEX的状态管理库

上一篇&#xff1a;VUE2项目&#xff1a;尚品汇VUE-CLI脚手架初始化项目以及路由组件分析&#xff08;一&#xff09; 目录 axios二次封装API接口管理与解决跨域API接口管理nprogress进度条配置 VUEX状态管理库三级分类动态背景颜色防抖三级联动跳转路由分析 axios二次封装 项…

12链表-双指针

目录 LeetCode之路——21. 合并两个有序链表 分析&#xff1a; LeetCode之路——19. 删除链表的倒数第 N 个结点 分析&#xff1a; LeetCode之路——21. 合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的…

网络运营和电子商务有什么区别

大家好&#xff0c;我是网络工程师成长日记实验室的郑老师&#xff0c;您现在正在查看的是网络工程师成长日记专栏&#xff0c;记录网络工程师日常生活的点点滴滴 一个同学他问我&#xff0c;他说学网络运营的话&#xff0c;它是不是电子商务里面的这个东西&#xff1f;像电子大…

二十六、设置时序电路初始状态的方法(初始值设置)(时序电路置数)2

方法2 在理解方法1的化简(1)这个方法后,又可以想到输入触发器R和S两个输入端的信号也无非就是0和1。那么直接用LOAD这个信号接在R和S两个输入端上即可。 先用开关判断触发器的R和S是低电平触发还是高电平触发(下图触发器可以直接看出为低电平触发,但是实际用管子搭建的触…

【那些年写过的愚蠢代码】

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

一维数组和二维数组的使用(char类型)

目录 导读1. 字符数组1.1 字符数组的创建1.2 字符数组的初始化1.3 不同初始化在内存中的不同1.3.1 strlen测试1.3.2 sizeof测试1.3.3 差异原因 1.4 字符数组的使用 2. 数组越界3. 数组作为函数参数博主有话说 导读 我们在前面讲到了 int 类型的数组的创建和使用&#xff1a; 一…

【【萌新的Risc-V学习之再看读不懂的流水线设计-10】】

萌新的Risc-V学习之再看读不懂的流水线设计-10 我们将流水线和之前案例中洗衣服的例子进行对照 我们把整个流水线分为5个阶段 也就是做成五级流水线 IF: 取指令ID: 指令译码和读寄存器堆EX: 执行或计算地址MEM: 数据存储器访问WB: 写回 我先在这里表述一下基本的几个指令的用…

javaSwing销售管理

​ 目录 一、选题背景 近几年来&#xff0c;传统商业与电商似乎是水火不容&#xff0c;大有不是你死便是我活的劲头。一直以来舆论都是一边倒的电商将迅速取代传统零售的论调&#xff0c;然而几年过去&#xff0c;电商的发展确实值得侧目&#xff0c;但传统商业虽然受到不小的…

深入学习git

1、git原理及整体架构图 一些常用的命令 git add . 或 git add src/com/ygl/hello/hello.java 指定文件 git commit . 或 git commit src/com/ygl/hello/hello.java 指定文件 git push origin 分支名称 2、git stash的应用场景 场景一&#xff1a;你正在当前分支A开发&…

计算机操作系统 (王道考研)笔记(四)I/O系统

目录 1 I/O1.1 I/O 概念和分类1.1.1 I/O 定义1.1.2 I/O 分类 1.2 I/O控制器1.3 I/O 软件层次结构1.4 I/O 应用程序接口和驱动程序应用接口 1 I/O 1.1 I/O 概念和分类 1.1.1 I/O 定义 BIOS&#xff08;英文&#xff1a;Basic Input/Output System&#xff09;&#xff0c;即基…

Redis主从复制、哨兵模式、群集部署

目录 一、Redis高可用 二、Redis主从复制 主从复制的作用 主从复制的流程 实例 三、Redis哨兵模式 哨兵的核心功能 哨兵模式的作用 哨兵结构的组成 故障转移机制 实例 四、Redis群集 集群的作用&#xff0c;可以归纳为两点&#xff1a; Redis集群的数据分片&#…

【Java开发】Redis位图轻松实现统计用户三日内留存数据

上一篇文章介绍了如何通过 Redis 位图实现统计日活周活月活&#xff0c;而 Redis 位图能做的远不止如此&#xff0c;本篇文章将介绍如何实现统计用户连续三日内登录的留存数据&#xff0c;从而更直观的反映软件的运营情况。 目录 1 实现思路 2 统计用户三日内留存数据 2.1 …

[AIGC] “惊天神器!Java大师推荐的终极工具 Netty ,让你的代码速度狂飙!“

前言&#xff1a; 在现代网络技术中&#xff0c;高性能的网络传输和通信已经成为了一项非常重要的技能。而Netty作为一款高性能、异步事件驱动的网络应用框架&#xff0c;成为了Java开发者们的首选工具之一。作为一位Java大师&#xff0c;今天我将从三个方面&#xff08;是什么…

C++笔记之环形队列

C笔记之环形队列 code review! 文章目录 C笔记之环形队列1.概念I——摘自 https://mp.weixin.qq.com/s/HUn9TF09RZ-UJKYPR5ZXhA2.概念II——摘自 http://t.csdnimg.cn/72bng3.概念III—— 摘自https://mp.weixin.qq.com/s/9Ga502p1DLcc6o75JBQlDg4.概念IV—— 摘自https://mp…

Scala第十三章节

Scala第十三章节 1. 高阶函数介绍 2. 作为值的函数 3. 匿名函数 4. 柯里化 5. 闭包 6. 控制抽象 7. 案例: 计算器 scala总目录 文档资料下载

面试打底稿⑦ 项目一的第三部分

简历原文 抽查部分 完成路线规划模块选择路线功能&#xff0c;用neo4j这种存储图关系的非关系数据库&#xff0c;实现最短线路规划、最低成本线路规划 设计优化物流信息模块&#xff0c;合理选择数据库、缓存技术&#xff0c;实现数据精简、流量削峰、提高系统可 用性 模拟问答…

2023(2024届)计算机保研经验分享,圆梦山东大学

前言&#xff1a; Hello大家好&#xff0c;我是Dream&#xff0c;好久不见啦&#xff01;在这不见的半年多时间里我一直在全身心的投入保研之中&#xff0c;在写下这份面经时&#xff0c;真的是感慨颇多&#xff0c;思绪万千。站在这个时间点上&#xff0c;回首过去的几个月&am…