力扣718-最长重复子数组(Java详细题解)

题目链接:718. 最长重复子数组 - 力扣(LeetCode)

前情提要:

因为本人最近都来刷dp类的题目所以该题就默认用dp方法来做。

dp五部曲。

1.确定dp数组和i下标的含义。

2.确定递推公式。

3.dp初始化。

4.确定dp的遍历顺序。

5.如果没有ac打印dp数组 利于debug。

每一个dp题目如果都用这五步分析清楚,那么这道题就能解出来了。

题目思路:

如果没有接触过子序列问题,那么第一次做这个题还是很有难度。

本题要求俩个数组中的公共最长连续子序列。

注意这里是要求连续的。

那么如果你做过674. 最长连续递增序列 - 力扣(LeetCode)或者看了我的题解力扣674-最长连续递增序列(Java详细题解)-CSDN博客,那么会好理解这道题一点。

话不多说,直接开始我们的dp五部曲。

1.确定dp数组和i下标的含义。

该题是要求俩个数组公共的子数组长度,那我们就要比较俩个数组的任意俩个元素。那我们是不是要用二维的dp数组来记录下这个状态呀。

用二维dp数组来记录每一个数组元素和另一个数组元素相比较的结果。

所以就要用到dp[i] [j]了。

注意这里dp[i] [j]的含义是指以i - 1结尾的数组和j - 1为结尾的数组俩个数组的最长公共子序列。

这里的dp含义在下面很多篇都会用到,大家要牢记这点。

至于为什么要设置i - 1和j - 1这样的含义,我们在初始化那个环节会讲,这里大家记住这个定义就好。

2.确定递推公式。

因为是要求公共的子数组,所以可能是当nums[i - 1] == nums[j - 1]的时候加入我们的结果。

为什么是i - 1和j - 1?

因为dp数组定义的就是i - 1结尾的数组和j - 1为结尾的数组俩个数组的最长公共子序列,所以只有nums[i - 1] == nums[j - 1]时,他们的dp[i] [j]才能被推出。

dp[i] [j] = 什么呢?

当nums[i - 1] == nums[j - 1]的时候,dp[i] [j] = dp[i - 1] [j - 1] + 1。

因为是求连续的公共数组,所以dp[i] [j] 只与他们前面一个状态dp[i - 1] [j - 1]有关。

当nums[i - 1] == nums[j - 1],dp[i] [j]是由dp[i - 1] [j - 1](下标i - 2结尾的数组和j - 2为结尾的数组俩个数组的最长公共子序列长度)加上 nums[i - 1] nums[j - 1]这俩个元素相同的长度,也就是1。

所以dp[i] [j] = dp[i - 1] [j - 1] + 1。

3.dp初始化。

该题的初始化部分很重要。

由递推公式可以看出,每一个dp[i] [j]在二维数组中都是由它左上的位置得出,所以要初始化dp[i] [0]和dp[0] [i]。也就是第一排和第一列。

由于dp数组定义的是以i - 1结尾的数组和j - 1为结尾的数组俩个数组的最长公共子序列。

所以第一排(dp[0] [i])是以下标-1为结尾的数组和i - 1为结尾的数组俩个数组的最长公共子序列。

以下标-1为结尾的数组不存在,所以他们的最长公共子序列自然就为0。

第一列同理可以得出也都初始化为0。

这就是我们为什么将dp数组定义为以i - 1和j - 1为结尾的数组的最长公共子序列。

这样便于初始化。如果定义为以i和j为结尾的数组最长公共子序列。

那么第一排第一列初始化就不一样了。

他们第一排和第一列是有意义的,并且他们还可能相同。

所以要遍历一遍第一列和第一排,如果nums[i] == nums[j] 那么dp[i] [j] = 1。

因为他们的值相同,第一排和第一列的最长公共子序列就为该元素。

4.确定dp的遍历顺序。

由递推公式可以看出dp[i] [j] 由dp[i - 1] [j - 1]可得。所以要从左到右,从上到下去遍历。

5.如果没有ac打印dp数组 利于debug。

在这里插入图片描述

最终代码:

class Solution {public int findLength(int[] nums1, int[] nums2) {//这里的dp含义是 以i - 1和j - 1为结尾的俩个数组最长子数组的长度。//为什么 定义 i- 1和 j - 1呢 是为了初始化方便。//递推公式 当nums1[i - 1] == nums2[j - 1] 说明俩个数组出现相等的值了 既然出现相等的值了//那我的dp[i][j] 就要加1了 因为我dp[i][j]是记录的i - 1和j - 1为结尾的俩个数组最长子数组的长度//那么在哪个状态上家呢?//其实子数组就是一种连续子序列 他的状态只与他的前一状态有关  所以与dp[i - 1][j - 1]有关//那么dp[i][j] = dp[i - 1][j - 1] + 1//紧接着我们就要进行初始化了//int [][] dp = new int [nums1.length + 1][nums2.length + 1];int result = 0;for(int i = 1;i <= nums1.length;i ++){for(int j = 1;j <= nums2.length;j ++){if(nums1[i - 1] == nums2[j - 1]){dp[i][j] = dp[i - 1][j - 1] + 1;}//因为只有nums1[i - 1] == nums2[j - 1]才会进入我们的dp数组,所以任意位置的dp数组都可能是最大的,所以我们要遍历一遍求最大的。result = Math.max(result,dp[i][j]);}}return result;}
}

这一篇博客就到这了,如果你有什么疑问和想法可以打在评论区,或者私信我。

我很乐意为你解答。那么我们下篇再见!

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

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

相关文章

Linux嵌入式相机 — 项目总结

main函数执行流程 1、初始化触摸屏 Touch_screen_Init();struct tsdev *ts NULL; ts ts_setup(NULL, 0); //以阻塞打开2、初始化 LCD LCD_Init(void); 通过 ioctl 函数获取 LCD 的固定参数、可变参数&#xff0c;得到分辨率、bpp、一行的长度&#xff08;以字节为单位&a…

【MATLAB源码-第225期】基于matlab的计算器GUI设计仿真,能够实现基础运算,三角函数以及幂运算

操作环境&#xff1a; MATLAB 2022a 1、算法描述 界面布局 计算器界面的主要元素分为几大部分&#xff1a;显示屏、功能按钮、数字按钮和操作符按钮。 显示屏 显示屏&#xff08;Edit Text&#xff09;&#xff1a;位于界面顶部中央&#xff0c;用于显示用户输入的表达式和…

【激励广告带来的广告收入与用户留存率的双重提升】

激励广告带来的广告收入与用户留存率的双重提升 ) 随着移动应用市场的竞争加剧&#xff0c;如何通过广告变现成为众多开发者关注的焦点。其中&#xff0c;激励广告&#xff08;Rewarded Ads&#xff09;凭借其用户友好、互动性强等特点&#xff0c;逐渐成为开发者的首选。那些…

Java——Static与final修饰的变量与方法(总结)

前言&#xff1a; Java语法学过一遍之后&#xff0c;我相信大多数和我一样脑瓜子嗡嗡的&#xff0c;甚至有点乱了&#xff0c;这时候应该自己把之前的能总结的&#xff0c;或者不熟悉的都要总结一遍&#xff0c;以便于后期的学习&#xff01;&#xff01; static修饰的成员变量…

[附源码]SpringBoot+VUE+Java实现人脸识别系统

今天带来一款优秀的项目&#xff1a;java人脸识别系统源码 。 系统采用的流行的前后端分离结构&#xff0c;内含功能包括 “人脸数数据录入”&#xff0c;“人脸管理”&#xff0c;“摄像头识别” 如果您有任何问题&#xff0c;也请联系小编&#xff0c;小编是经验丰富的程序员…

数码好物抢先看!2024有什么好用又实惠的好物推荐!

在数字科技日新月异的今天&#xff0c;各种数码好物层出不穷&#xff0c;它们以其先进的技术、创新的功能以及不断提升的性能&#xff0c;为我们的生活带来了极大的便利和乐趣。对于消费者来说&#xff0c;在众多的数码产品中挑选出好用又实惠的好物&#xff0c;无疑是一件既令…

Spring Controller

服务器控制 响应架构 Spring Boot 内集成了 Tomcat 服务器&#xff0c;也可以外接 Tomcat 服务器。通过控制层接收浏览器的 URL 请求进行操作并返回数据。 底层和浏览器的信息交互仍旧由 servlet 完成&#xff0c;服务器整体架构如下&#xff1a; Server&#xff1a; Tomcat…

电机知识总结

一.直流无刷电机&#xff08;BLDC&#xff09; 27N30P指有27个槽&#xff0c;30的极数&#xff0c;它的极对数&#xff1a;30/215,所以是15对极。 N必须是3的倍数&#xff0c;P必须是偶数&#xff0c; 电角度是电气特性&#xff0c;机械角度是空间特性&#xff0c;必须指明是谁…

Selenium等待机制:理解并应用显式等待与隐式等待,解决页面加载慢的问题

目录 引言 等待机制的重要性 显式等待&#xff08;Explicit Wait&#xff09; 原理 应用方式 代码示例 优点与缺点 隐式等待&#xff08;Implicit Wait&#xff09; 原理 应用方式 代码示例 优点与缺点 解决页面加载慢的问题 1. 合理设置等待时间 2. 优先使用显…

数据三维可视化技术的应用场景

数据三维可视化技术作为一种强大的工具&#xff0c;已经在各个领域展现出了巨大的应用潜力。它不仅提供了直观、生动的数据展示方式&#xff0c;还让用户能够更深入地理解数据间的关联和趋势。下面将探讨数据三维可视化技术的应用范围及其在不同领域中的重要性。 数据三维可视化…

控价服务如何判断高低

在当今竞争激烈的市场环境中&#xff0c;品牌控价成为企业发展的关键一环。许多品牌选择与第三方控价公司合作&#xff0c;借助其专业的电商价格监测系统&#xff0c;既能节省人力成本&#xff0c;又能获得高质量的服务。然而&#xff0c;如何判断第三方控价服务系统的优劣呢&a…

VirtualBox7.1.0 安装 Ubuntu22.04.5 虚拟机

环境 &#xff08;1&#xff09;宿主机系统&#xff1a;Windows10 &#xff08;2&#xff09;虚拟机软件&#xff1a;VirtualBox7.1.0 &#xff08;3&#xff09;虚拟机系统&#xff1a;Ubuntu 22.04.5 LTS (Jammy Jellyfish) 步骤 &#xff08;1&#xff09;第一步 &…

2024年最新版TypeScript学习笔记——泛型、接口、枚举、自定义类型等知识点

今天带来的是来自尚硅谷禹神2024年8月最新的TS课程的学习笔记&#xff0c;不得不说禹神讲的是真的超级棒&#xff01; 文章目录 TS入门JS中的困扰静态类型检查编译TS命令行编译自动化编译 类型检查变量和函数类型检查字面量类型检查 类型推断类型声明声明对象类型声明函数类型…

个人驾校预约管理系统设计与实现

个人驾校预约管理系统设计与实现 摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装个人驾校预约管理系统软件…

3.js - THREE.CubeTextureLoader() 添加环境纹理,以创建立方体贴图

使用 THREE.CubeTextureLoader() 添加环境纹理&#xff0c;以创建立方体贴图 不使用 THREE.CubeTextureLoader() 的时候 源码 import * as THREE from three import { OrbitControls } from three/examples/jsm/controls/OrbitControls import { RGBELoader } from three/exam…

SHAP 模型可视化 + 参数搜索策略在轴承故障诊断中的应用

往期精彩内容&#xff1a; Python-凯斯西储大学&#xff08;CWRU&#xff09;轴承数据解读与分类处理 Python轴承故障诊断入门教学-CSDN博客 Python轴承故障诊断 (13)基于故障信号特征提取的超强机器学习识别模型-CSDN博客 Python轴承故障诊断 (14)高创新故障识别模型-CSDN…

【鸿蒙】HarmonyOS NEXT开发快速入门教程之ArkTS语法装饰器(上)

文章目录 前言一、ArkTS基本介绍1、 ArkTS组成2、组件参数和属性2.1、区分参数和属性的含义2.2、父子组件嵌套 二、装饰器语法1.State2.Prop3.Link4.Watch5.Provide和Consume6.Observed和ObjectLink代码示例&#xff1a;示例1&#xff1a;&#xff08;不使用Observed和ObjectLi…

新媒体运营

一、新媒体运营的概念 1.新媒体 2.新媒体运营的五大方向 用户运营 产品运营 。。。 二、新媒体的岗位职责及要求 三、新媒体平台

数仓工具:datax

datax可以理解为sqoop的优化版&#xff0c; 速度比sqoop快 因为sqoop底层是map任务&#xff0c;而datax底层是基于内存 DataX 是一个异构数据源离线同步工具&#xff0c;致力于实现包括关系型数据库(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各种异构数据源之间稳定…

群晖NAS使用Docker本地部署网页版Ubuntu系统并实现无公网IP远程访问

文章目录 前言1. 下载Docker-Webtop镜像2. 运行Docker-Webtop镜像3. 本地访问网页版Linux系统4. 群晖NAS安装Cpolar工具5. 配置异地访问Linux系统6. 异地远程访问Linux系统7. 固定异地访问的公网地址 前言 本文旨在详细介绍如何在群晖NAS部署docker-webtop&#xff0c;并结合c…