力扣-718最长重复子数组(dp)
创始人
2025-05-28 04:19:14
0

力扣-718最长重复子数组

1、题目

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

示例 1:

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

2、分析

  • 题目。由题目可知,我们要求得是两个数组中间最长的相同的一部分,这里我还是首先想到的是暴力,推一下确实暴力也能够进行推出来。但是我们要进一步看能不能进行优化,根据最长长度,我们可以联想到是不是可以使用dp动态规划,答案是可以的。

  • 1)二维dp推导。这里我们要推导,所以跟前一个状态有关,前一个状态是什么?那就是nums1[i - 1]和nums2[j - 1]相等,也就是前一个数是相等的,所以我们到当前这个数时就做长度+1操作。也就是dp[i]【j】=dp[i - 1]【j-1】+1。

    2)或者第二种想法,就是按图形来分析。两个数组,一个为列,一个为行,所以就对应的话,这个对应的十字交点相等,那么值就是左上角值+1,也就是dp[i]【j】=dp[i - 1]【j-1】+1。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HcCf14S8-1678845287470)(img/image-20230315093539882.png)]

  • dp边界。由于第一个数可能会相等,所以左上角必须有值也就是i-1与j-1得,所以长度要比nums数组多1。

  • 一维dp推导,由图像可知,后一行的数是前一行的数复制到下一行然后如果当前数前一个相等,就当前数为前面一个加1。也就是至于那一行的数有关,dp[j]=dp[j-1] + 1;

3、代码及注释

class Solution {public int findLength(int[] nums1, int[] nums2) {// 1.进行暴力遍历int max = 0;for (int i = 0; i < nums1.length; i++){int temp = 0;for (int j = 0; j < nums2.length; j++) {if (nums1[i] == nums2[j]){temp++;int k = i;int m = j;while(k + 1 < nums1.length && m + 1 < nums2.length && nums1[++k] == nums2[++m]){temp++;}max = Math.max(max, temp);temp = 0;}}}return max;// 2.二维dpint[][] dp = new int[nums1.length + 1][nums2.length + 1];int max = 0;for (int i = 1; i < nums1.length + 1; i++){for (int j = 1; j < nums2.length + 1; j++){if (nums1[i - 1] == nums2[j - 1]){dp[i][j] = dp[i - 1][j - 1] + 1;max = Math.max(max, dp[i][j]);}}}return max;// 3.一维dpint[] dp = new int[nums2.length + 1];int max = 0;for (int i = 1; i < nums1.length + 1; i++){for (int j = nums2.length; j > 0; j--){if (nums1[i - 1] == nums2[j - 1]){dp[j] = dp[j - 1] + 1;}else{// 每一次继承上一行的dp[j]值,如果相等,就会+1存max中,如果不相等,当前行刷新dp[j]值为0。dp[j] = 0;}max = max > dp[j] ? max : dp[j];}}return max;}
}

4、练习

力扣题目练习:718. 最长重复子数组

相关内容

热门资讯

FatFS的文件操作 1、文件操作 1.1、f_open 打开/创建文件 FRESULT f_open (FIL* fp...
55-蓝桥部队(蓝桥杯) 题目描述小明是蓝桥部队的长官,他的班上有 N 名军人和 1 名军师。这天,...
Linux INPUT 子系统... 按键、鼠标、键盘、触摸屏等都属于输入(input)设备,Linux 内核为此专门做了一...
计算机网络-DNS和域名关系 DNS服务器 DNS是Domain Name Service的缩写,DNS服务器进行...
ElementUI学习笔记 目录 一、简单介绍 二、安装 1、下载 2、引入 三、布局 1、简介 2、使用 3、好处 四、布局容...
vim 结合ctags -- ... Vim 和 ctags 是两个非常强大的工具,它们可以结合使用来提高代码编辑和导航的效率。下面是详细...
浅析01背包问题 一 题目描述: 有n个物品,它们有各自的体积和价值,现有给定容量的背包...
多线程——初阶 认识线程1.1概念1.1.1线程是什么一个线程就是一个“执行流”。每个线程之间都可以按照顺序执行自己...
循环地图中角色移动教程 接上文 基于概率的循环地图 Unlit Shader http://t.csdn.cn/d7WaR本...
深度学习求解泊松方程的区域分解... 二维泊松方程 { − Δ u = f , in Ω , u = g , on
大数据的常用算法(分类、回归分... 在大数据时代,数据挖掘是最关键的工作。大数据的挖掘是从海量、不完全的、有噪声的、模糊的...
A.[OCR]基于Paddle... 基于PaddleOCR的多视角集装箱箱号检测识别 一、项目介绍 集装箱号是指装运出口货物集装箱的箱号...
开源物联网平台推荐介绍 开源物联网平台调研 文章目录开源物联网平台调研一、 调研推荐开源物联网平台及背景介绍二、社区支持度与...
Python算法学习[4]—树... 树、二叉树、霍夫曼树&算法实现 在计算机科学的领域中,树是一种非常重要的数据结构&#x...
87、Let 2D Diffu... 简介 主页:https://ku-cvlab.github.io/3DFuse/ 分数...
leetcode每日一题28 283. 移动零 第一反应是冒泡 class Solution {public:void moveZ...
SpringBoot整合Jav... 目录 一、创建一个spring boot工程 二、导入JavaFX依赖 三、创建fxml文件以及co...
C++一些常见问题 宏是什么 参考博客地址 宏是C/C++所支持的一种语言特性,我对它最初...
Flink-DataStrea... ​编辑执行环境         创建执行环境         执行模式         触发程序执行...
最新消息!信息系统项目管理师教... 《信息系统项目管理师教程(第4版)》于2023年3月出版 新版《信...