链接:https://leetcode.cn/problems/maximum-length-of-repeated-subarray/solution/-by-xun-ge-v-5he0/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

题目

思路

  • 确定dp数组(dp table)以及下标的含义

dp[i][j] :以下标i - 1为结尾的A,和以下标j - 1为结尾的B,最长重复子数组长度为dp[i][j]。

此时细心的同学应该发现,那dp[0][0]是什么含义呢?总不能是以下标-1为结尾的A数组吧。

其实dp[i][j]的定义也就决定着,我们在遍历dp[i][j]的时候i 和 j都要从1开始。

那有同学问了,我就定义dp[i][j]为 以下标i为结尾的A,和以下标j 为结尾的B,最长重复子数组长度。不行么?

行倒是行!但实现起来就麻烦了一些,大家看下面的dp数组状态图就明白了。

  • 确定递推公式

根据dp[i][j]的定义,dp[i][j]的状态只能由dp[i - 1][j - 1]推导出来。

即当A[i - 1] 和B[j - 1]相等的时候,dp[i][j] = dp[i - 1][j - 1] + 1;

根据递推公式可以看出,遍历i 和 j 要从1开始!

  • dp数组如何初始化

根据dp[i][j]的定义,dp[i][0] 和dp[0][j]其实都是没有意义的!

但dp[i][0] 和dp[0][j]要初始值,因为 为了方便递归公式dp[i][j] = dp[i - 1][j - 1] + 1;

所以dp[i][0] 和dp[0][j]初始化为0。

举个例子A[0]如果和B[0]相同的话,dp[1][1] = dp[0][0] + 1,只有dp[0][0]初始为0,正好符合递推公式逐步累加起来。

  • 确定遍历顺序

外层for循环遍历A,内层for循环遍历B。

那又有同学问了,外层for循环遍历B,内层for循环遍历A。不行么?

也行,一样的,我这里就用外层for循环遍历A,内层for循环遍历B了。

同时题目要求长度最长的子数组的长度。所以在遍历的时候顺便把dp[i][j]的最大值记录下来。

代码

#define MAX(a, b) ((a) > (b) ? (a) : (b))int findLength(int* nums1, int nums1Size, int* nums2, int nums2Size){int dp[nums1Size+1][nums2Size+1];for(int i = 0; i < nums1Size+1; i++)//初始化for(int j = 0; j < nums2Size+1; j++) dp[i][j] = 0;int max = 0;for(int i = 1; i <= nums1Size; i++)//枚举nums1和nums2{for(int j = 1; j <= nums2Size; j++){if(nums1[i-1] == nums2[j-1])//保存最长子数组dp[i][j] = MAX(dp[i][j], dp[i-1][j-1] + 1);max = MAX(max, dp[i][j]);}}return max;
}作者:xun-ge-v
链接:https://leetcode.cn/problems/maximum-length-of-repeated-subarray/solution/-by-xun-ge-v-5he0/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

LeetCode·718.最长重复子数组·动态规划相关推荐

  1. 115. Leetcode 718. 最长重复子数组 (动态规划-子序列问题)

    步骤一.确定状态: 确定dp数组及下标含义 dp[i][j]表示的是长度为i的A数组和长度为j的B数组公共的长度最长的子数组的长 度. 步骤二.推断状态方程: 考虑下dp[i][j], 因为这里的子数 ...

  2. Java实现 LeetCode 718 最长重复子数组(动态规划)

    718. 最长重复子数组 给两个整数数组 A 和 B ,返回两个数组中公共的.长度最长的子数组的长度. 示例 1: 输入: A: [1,2,3,2,1] B: [3,2,1,4,7] 输出: 3 解释 ...

  3. LeetCode 718最长重复子数组

    题目链接:力扣                                                子序列默认不连续,子数组默认连续 思路: 动态规划: 定义dp数组:         dp ...

  4. LeetCode 718. 最长重复子数组(DP)

    1. 题目 给两个整数数组 A 和 B ,返回两个数组中公共的.长度最长的子数组的长度. 示例 1: 输入: A: [1,2,3,2,1] B: [3,2,1,4,7] 输出: 3 解释: 长度最长的 ...

  5. leetcode 718. 最长重复子数组

    难度:中等 频次:53 题目:给两个整数数组 nums1 和 nums2 ,返回 两个数组中 公共的 .长度最长的子数组的长度 . 解题思路:动态规划 注意: 为什么使用动态规划?---->求最 ...

  6. 每日题解:LeetCode 718. 最长重复子数组

    题目地址 个人博客地址 题目描述 给两个整数数组 A 和 B ,返回两个数组中公共的.长度最长的子数组的长度. 示例:输入: A: [1,2,3,2,1] B: [3,2,1,4,7] 输出:3 解释 ...

  7. LeetCode 718 最长重复子数组

    给两个整数数组 A 和 B ,返回两个数组中公共的.长度最长的子数组的长度. A: [1,2,3,2,1] B: [3,2,1,4,7] 数组+长度,这种问题看来很多都可以采用二分搜索算法,因为长度有 ...

  8. 2022-2-1 leetcode.718.最长重复子数组

    别人的做法 int findLength(vector<int>& A, vector<int>& B) {int len1 = A.size(), len2 ...

  9. leetcode(力扣) 718. 最长重复子数组 1143. 最长公共子序列 1035. 不相交的线 (动态规划)

    文章目录 718. 最长重复子数组 题目描述 思路分析 完整代码 1143. 最长公共子序列 1035. 不相交的线: 这三道题思路基本一样,尤其是最后两道,代码都一样,一点不需要改的,所以放一起把. ...

最新文章

  1. 关于BMP格式图像的理解和读写(c++).docx
  2. iOS - Swift NSEnumerator 迭代器
  3. Linux监控服务命令
  4. android menu 小红点,Android自定义ActionProvider ToolBar实现Menu小红点
  5. staruml透明_第05组 团队项目-需求分析报告
  6. 白噪音和粉红噪音煲机_白噪音app体验报告
  7. 谷歌开源文件访问漏洞审计工具 PathAuditor(详解)
  8. 一张图学会python应用到excel-Python应用之------Excel操作
  9. 数据库 -- MySQL使用
  10. 北斗GNSS无人巡检车辆的高精度定位定向应用方案
  11. shell机器人企业微信通知
  12. 使用metamask发起交易的时候,交易卡在pending了怎么办?
  13. 算法培训(一)---排序算法
  14. 南宁计算机职称考试网,南宁人事考试职称网
  15. js 网页做一个简单的计算器
  16. 解决IE浏览器下载文件,文件名乱码问题(浏览器历史介绍)
  17. 【Android】短信应用——短信截获
  18. spring boot 文件下载接口
  19. BABYLON 三维开发工具的使用
  20. 无人机飞控三大算法汇总

热门文章

  1. Github: fatal: Unsupported SSL backend ‘“openssl”‘. Supported SSL backends: openssl schannel
  2. Compose实现webView文件选择
  3. 2021届秋招腾讯前端一面面经
  4. 资深研发真实编写的骚注释,你学废了么?
  5. ndn中自适应转发策略总结
  6. 常用的一些伺服电机参数
  7. [Python随笔]暴力解解决“崩铁”的引航罗盘解密
  8. 《弟子规》全集译文,为孩子的明天存下来!
  9. 南邮 OJ 1076 机器狗组装费用
  10. 2022 互联网中秋月饼大赏,腾讯送火腿,字节寓意圆满,你最钟爱哪款呢?