当前位置: 首页 > ai >正文

leetcode 718. Maximum Length of Repeated Subarray

目录

题目描述

第一步,明确并理解dp数组及下标的含义

第二步,分析明确并理解递推公式

第三步,理解dp数组如何初始化

第四步,理解遍历顺序

代码


题目描述

这是子序列问题。子数组是连续的子序列。

第一步,明确并理解dp数组及下标的含义

用下标(i-1)遍历nums1数组,用下标(j-1)遍历nums2数组。

        int len1 = nums1.size();

        int len2 = nums2.size();

        //i的取值范围是[1,len1]

        //j的取值范围是[1,len2]

        //dp[i][j]表示以nums1[i-1]结尾和以nums2[j-1]结尾的最长公共子数组的长度

如果nums1[i-1]等于nums2[j-1],才存在以nums1[i-1]结尾和以nums2[j-1]结尾的公共子数组。例如

nums1 = [1,2,3,2,1], nums2 = [3,2,1,4,7]

nums1[0]和nums2[0]不相等,此时不存在以nums1[0]结尾和以nums2[0]结尾公共子数组,dp[1][1]应该为0。

nums1[1]和nums2[1]都是2,此时以nums1[2]结尾和以nums2[1]结尾的最长公共子数组就是2这单个数构成的子数组,dp[2][2]应该为1。

第二步,分析明确并理解递推公式

对于i不等于0且j不等于0的情况:

如果nums1[i-1]等于nums2[j-1],假如它们的值是x。说明x这单个数构成的子数组肯定是以nums1[i-1]结尾和以nums2[j-1]结尾的公共子数组,但不一定是最长的。容易理解dp[i][j]=dp[i-1][j-1] +1。

如果nums1[i-1]不等于nums2[j-1],此时不存在以nums1[i-1]结尾和以nums2[j-1]结尾的公共子数组,dp[i][j]等于0。

第三步,理解dp数组如何初始化

        //dp[0][j]表示nums1为空,显然此时nums1和nums2没有公共子数组,dp[0][j]都应该初始化为0

        //dp[i][0]表示nums2为空,显然此时nums1和nums2没有公共子数组,dp[i][0]都应该初始化为0

        //当i!=0 && j!=0时,分两种情况:

        //如果nums1[i-1]==nums2[j-1],dp[i][j]=dp[i-1][j-1]+1,即后面的dp[i][j]由前面的dp[i-1][j-1]覆盖计算,因此dp[i][j]可以不初始化,或者为了写代码方便可以统一初始化为0。

        //如果nums1[i-1]!=nums2[j-1],dp[i][j]应该为0,初始化时候统一赋0也没问题。

第四步,理解遍历顺序

由递推公式,可知i和j都应该从小到大遍历。注意i的取值范围是[1,len1],j的取值范围是[1,len2]。

代码

class Solution {
public:int findLength(vector<int>& nums1, vector<int>& nums2) {int len1 = nums1.size();int len2 = nums2.size();//i的取值范围是[1,len1]//j的取值范围是[1,len2]//dp[i][j]表示以nums1[i-1]结尾和以nums2[j-1]结尾的最长公共子数组的长度//dp[0][j]表示nums1为空,显然此时nums1和nums2没有公共子数组,dp[0][j]都应该初始化为0//dp[i][0]表示nums2为空,显然此时nums1和nums2没有公共子数组,dp[i][0]都应该初始化为0//当i!=0 && j!=0时,分两种情况://如果nums1[i-1]==nums2[j-1],dp[i][j]=dp[i-1][j-1]+1,即后面的dp[i][j]由前面的dp[i-1][j-1]覆盖计算,因此dp[i][j]可以不初始化,或者为了写代码方便可以统一初始化为0。//如果nums1[i-1]!=nums2[j-1],dp[i][j]应该为0,初始化时候统一赋0也没问题。vector<vector<int>> dp(len1+1,vector<int>(len2+1,0));int res = 0;for(int i = 1;i <=len1;i++){for(int j = 1; j <=len2;j++){if(nums1[i-1] == nums2[j-1])dp[i][j] = dp[i-1][j-1] + 1;if(dp[i][j] > res)res = dp[i][j];}}return res;}
};
http://www.xdnf.cn/news/725.html

相关文章:

  • 【matlab|python】矢量棍棒图应用场景和代码
  • Redis——通信协议
  • 第35讲:构建属于自己的遥感大模型平台,并接入地理数据工作流
  • Ubuntu修改Swap交换空间大小
  • 深入浅出 C++ 核心基础:从语法特性到入门体系构建
  • C语言if
  • 大模型之路(day 1)
  • 嵌入式学习——远程终端登录和桌面访问
  • Java Web项目(一)
  • Mysql相关知识2:Mysql隔离级别、MVCC、锁
  • 深度可分离卷积与普通卷积的区别及原理
  • 【C++】继承----上篇
  • mysql
  • QSS【QT】
  • 常见超低噪声 LDO,ADM7150、LP5907、SGN2036、TPL910
  • 力扣刷题 - 203.移除链表元素
  • 4.20刷题记录(单调栈)
  • 基于springboot的商城
  • 积木报表查询出现jdbc.SQLServerException: 对象名 ‘user_tab_comment 的解决方法
  • 力扣算法ing(61 / 100)
  • 5.1 掌握函数定义与参数传递的奥秘
  • 【Qt】信号和槽
  • [安全实战]逆向工程核心名词详解
  • DAY6:从执行计划到索引优化的完整指南
  • React基础知识(补充中)
  • PyTorch基础学习系列一
  • 安卓手机怎样配置数据加速
  • Java File 类详解
  • 从事计算机视觉需要掌握哪些知识
  • 微信小程序通过mqtt控制esp32