代码随想录算法训练营第五十二天| 300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组

2023-05-16

文章目录

      • 300.最长递增子序列
      • 674. 最长连续递增序列
      • 718. 最长重复子数组

300.最长递增子序列

想清楚如何推导dp数组是关键

两层for循环,因为递增序列不是连续的

  • 题目链接:代码随想录

  • 解题思路:
    1.dp[i]表示i之前包括i的以nums[i]结尾的最长递增子序列的长度
    2.状态转移方程:位置i的最长升序子序列等于j从0到i-1各个位置的最长升序子序列 + 1 的最大值
    3.dp[i]的初始化:每一个i,对应的dp[i](即最长递增子序列)起始大小至少都是1
    4.遍历顺序
    dp[i] 是有0到i-1各个位置的最长递增子序列 推导而来,那么遍历i一定是从前向后遍历。
    j其实就是遍历0到i-1,那么是从前到后,还是从后到前遍历都无所谓,只要吧 0 到 i-1 的元素都遍历了就行了。 所以默认习惯从前向后遍历。

  • 推导过程

    Snipaste_2023-05-05_20-43-08
public int lengthOfLIS(int[] nums) {
    //1.定义dp数组
    int[] dp = new int[nums.length];

    //2.初始化dp数组
    Arrays.fill(dp, 1);

    int result = 1;

    //3.遍历
    for (int i = 1; i < nums.length; i++) {

        //第二层for循环用于更新dp的值
        for (int j = 0; j < i; j++) {
            if(nums[j] < nums[i]){
                dp[i] = Math.max(dp[j] + 1, dp[i]);//不断更新dp[i]
            }
        }

        result = Math.max(result, dp[i]);
    }

    return result;
}

674. 最长连续递增序列

不连续递增子序列的跟前0-i 个状态有关,连续递增的子序列只跟前一个状态有关

  • 题目链接:代码随想录

  • 解题思路:

    本题与上一题的区别:
    ①公式:dp[i] = dp[i - 1] + 1;
    ②遍历形式:本题要求连续递增子序列,所以就只要比较nums[i]与nums[i - 1],而不用去比较nums[j]与nums[i] (j是在0到i之间遍历)。
    既然不用j了,那么也不用两层for循环,本题一层for循环就行,比较nums[i] 和 nums[i - 1]。

  • 推导过程:

    Snipaste_2023-05-05_21-01-39
public int findLengthOfLCIS(int[] nums) {

    if(nums.length == 0){
        return 0;
    }
    //1.dp数组
    int[] dp = new int[nums.length];

    //2.初始化
    Arrays.fill(dp, 1);

    int result = 1;

    //3.遍历
    //注意这里是一层for循环遍历
    for (int i = 1; i < dp.length; i++) {
        if(nums[i] > nums[i - 1]){
            dp[i] = Math.max(dp[i], dp[i - 1] + 1);//更新dp数组
        }

        if(result < dp[i]){
            result = Math.max(result, dp[i]);
        }
    }

    return result;
}

//贪心:
// public int findLengthOfLCIS(int[] nums) {

//     if (nums.length == 0) return 0;
//     int res = 1; // 连续子序列最少也是1
//     int count = 1;
//     for (int i = 0; i < nums.length - 1; i++) {
//         if (nums[i + 1] > nums[i]) { // 连续记录
//             count++;
//         } else { // 不连续,count从头开始
//             count = 1;
//         }
//         if (count > res) res = count;
//     }
//     return res;
// }

718. 最长重复子数组

  1. 暴力解法:只需要先两层for循环确定两个数组起始位置,然后再来一个循环可以是for或者while,来从两个起始位置开始比较,取得重复子数组的长度

  2. 本题动态规划就是记录下暴力解法的所有可能性结果下,以某下表结尾的连续子数组的最大长度。记忆状态换时间

  • 题目链接:代码随想录

  • 解题思路:
    1.dp数组定义:dp(i)[j] :以下标i - 1为结尾的A,和以下标j - 1为结尾的B,最长重复子数组长度为dp(i)[j]。
    2.递推公式:当A[i - 1] 和B[j - 1]相等的时候,dp(i)[j] = dp(i - 1)[j - 1] + 1;这时由前一个状态推导而来
    3.初始化
    根据dp(i)[j]的定义,dp(i)[0] 和dp(0)[j]其实都是没有意义的!但dp(i)[0] 和dp(0)[j]要初始值,因为
    为了方便递归公式dp(i)[j]= dp(i - 1)[j - 1] + 1;
    举个例子A[0]如果和B[0]相同的话,dp(1)[1] = dp(0)[0] + 1,只有dp[0][0]初始为0,正好符合递推公式逐步累加起来。

  • 推导过程:

    Snipaste_2023-05-05_21-17-37
public int findLength(int[] nums1, int[] nums2) {
    //1.定义dp数组
    int[][] dp = new int[nums1.length + 1][nums2.length + 1];//因为dp数组的含义是一i-1下标为结尾的数组的长度
    //2.初始化
    //3.遍历
    int result = 0;

    for (int i = 1; i <= nums1.length; i++) {//i从1开始  nums1数组
        for (int j = 1; j <= nums2.length; j++) {//      nums2数组
            if(nums1[i - 1] == nums2[j - 1]){
                dp[i][j] = dp[i - 1][j - 1] + 1;
                result = Math.max(result, dp[i][j]);
            }
        }
    }

    return result;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

代码随想录算法训练营第五十二天| 300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组 的相关文章

  • 51单片机实例6——用定时器T0中断控制1位LED秒闪烁

    用定时器T0中断控制1位LED秒闪烁 1 设计目的 用定时器T0中断控制1位LED秒闪烁 2 仿真电路 3 程序设计 xff08 C语言 xff09 include lt reg51 h gt include lt math h gt sb
  • ubuntu 18.04 ARM架构ECS更换默认源(2020.04)

    这里写自定义目录标题 0x00 ubuntu18 04 apt国内源0x01 一个source list的构成0x02 更换并更新源0x03 其他 0x00 ubuntu18 04 apt国内源 最近开的新的arm架构的ECS更换国内源的记
  • 【python】使用pip安装python第三方库(简单易懂)

    作者 二月知野 专栏 人生苦短 我学python Python语言有超过12万个第三方库 xff0c 覆盖信息技术几乎所有领域 例如 网络爬虫 自动化 数据分析与可视化 WEB开发 机器学习和其他常用的一些第三方库 什么是pip pip是p
  • PTA 7-1 字符串模式匹配(KMP)

    给定一个字符串 text 和一个模式串 pattern xff0c 求 pattern 在text 中的出现次数 text 和 pattern 中的字符均为英语大写字母或小写字母 text中不同位置出现的pattern 可重叠 输入格式 输
  • 洛谷P1233 木棍加工 动态规划 最大上升子序列

    P1233 木棍加工 Java 实现 思路 xff1a 这题的思路一定是贪心 xff0b 动态规划 xff0c 当遇上既有长度又有宽度的木棒的 xff0c 可以先对长度进行排序 xff08 如果长度相同 xff0c 则根据宽度排序 xff0
  • 解决selenium使用webdriver.Chrome()报错的问题

    运行时报错 第一个解决方法 xff1a driver 61 webdriver Chrome 34 webdriver驱动路径 34 记得是绝对路径 xff0c 记得和谷歌浏览器放在一起 谷歌驱动下载 xff08 你安装驱动才可以用seln
  • 猜数字游戏(c语言实现)

    一个简单的猜数字游戏送给大家 xff0c 非常适合初学者练习 xff0c 为此 xff0c 我将详细地讲解每一个步骤 我的码云地址 xff1a https gitee com small protrusion c practice code
  • goto语句实现关机小程序

    C语言中提供了可以随意滥用的 goto语句和标记跳转的标号 从理论上 goto语句是没有必要的 xff0c 实践中没有goto语句也可以很容易的写出代码 而goto语句无非就是直接跳到符号那里去 xff0c 这个符号不固定 xff0c 可以
  • C语言中的函数(详解)

    目录 1 函数是什么 2 c语言中函数的分类 xff1a 2 1 库函数 2 自定义函数 3 函数的参数 3 1 实际参数 xff08 实参 xff09 3 2 形式参数 xff08 形参 xff09 4 函数的调用 xff1a 4 1 传
  • C语言练习题(递归)

    目录 1 接受一个整型值 xff08 无符号 xff09 xff0c 按照顺序打印它的每一位 2 编写函数不允许创建临时变量 xff0c 求字符串的长度 3 求n的阶乘 xff08 不考虑溢出 xff09 4 求第n个斐波那契数 xff08
  • c语言—数组

    目录 1 一维数组的创建和初始化 1 1 数组的创建 1 2 数组的初始化 1 3 一维数组的使用 1 4 一维数组在内存中的存储 2 二维数组的创建和初始化 2 1 二维数组的创建 2 2 二维数组的初始化 2 3 二维数组的使用 2 4
  • 【C语言】三子棋游戏(详解)

    大家好 xff0c 我是小突突 今天我想详细地和你讲解这个三子棋小游戏是怎样实现的 目录 1 基本流程 2 配置运行环境 3 代码过程 3 1菜单界面选择开始或者退出游戏 3 2 创建棋盘并初始化 3 3打印棋盘 4 玩家落子并打印棋盘 5
  • ARM64开发板Ubuntu18.04环境安装docker-compose

    ARM64开发板Ubuntu18 04环境安装docker compose 硬件环境安装docker compose 硬件环境 我使用的是3399开发板 xff0c 开发板安装了ubuntu18 04 xff0c 最近想把程序都倒腾到doc
  • 一篇文章带你搞懂扫雷小游戏(c语言实现)

    目录 前言 1 游戏设计逻辑 2 游戏思考及实现过程 2 1符号与棋盘的建立 2 2棋盘的初始化与打印 2 3布置雷 2 4 排查雷并设置结束标志 3 代码展示 test c game c game h 前言 扫雷是一款经典的小游戏 xff
  • 操作符详解—c语言

    目录 1 操作符分类 xff1a 2 算术操作符 3 移位操作符 3 1 左移操作符 3 2 右移操作符 4 位操作符 5 赋值操作符 6 单目操作符 6 1 单目操作符介绍 7 关系操作符 8 逻辑操作符 9 条件操作符 10 逗号表达式
  • (初阶)指针

    好长时间没有更新博客了 xff0c 博主前段时间考虑了自己的学习路线 xff0c 还是想要去考个研究生 xff0c 以后会一直更新的 本篇文章简单地讲解一下指针的一些基础知识 xff0c 大招还会放在后面 目录 1 指针是什么 xff1f
  • (c语言)初识结构体

    目录 1 结构体的声明 1 1 结构的基础知识 1 2 结构的声明 1 3 结构成员的类型 1 4 结构体变量的定义和初始化 2 结构体成员的访问与传参 1 结构体的声明 1 1 结构的基础知识 结构是一些值的集合 xff0c 这些值称为成
  • (修炼内功)函数栈帧的创建和销毁

    前言 修炼内功才是你和别人拉开差距的地方 越触及底层就会发现计算机竟有如此的有魅力 希望每个看到这篇文章的人都可以好好食用 目录 前言 1 什么是函数栈帧 2 理解函数栈帧能解决什么问题呢 xff1f 3 函数栈帧的创建和销毁解析 3 1
  • 调试技巧总结

    目录 1 调试是什么 xff1f 2 调试的基本步骤 3 Debug和Release的介绍 4 调试实例 4 1 实现代码 xff1a 求 1 xff01 43 2 xff01 43 3 xff01 43 n xff1b 不考虑溢出 4 2
  • 一篇文章带你弄懂数据的存储(C语言)

    前面我们已经初步了解了数据类型 xff0c 接下来我们就详细来学习进阶的数据存储 目录 1 类型的基本归类 2 分析两种数据类型的取值范围 3 大小端 大小端字节序存储 介绍 3 1什么大端小端 xff1a 3 2 为什么有大端和小端 3

随机推荐