LeetCode·718.最长重复子数组·动态规划
链接: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.最长重复子数组·动态规划相关推荐
- 115. Leetcode 718. 最长重复子数组 (动态规划-子序列问题)
步骤一.确定状态: 确定dp数组及下标含义 dp[i][j]表示的是长度为i的A数组和长度为j的B数组公共的长度最长的子数组的长 度. 步骤二.推断状态方程: 考虑下dp[i][j], 因为这里的子数 ...
- Java实现 LeetCode 718 最长重复子数组(动态规划)
718. 最长重复子数组 给两个整数数组 A 和 B ,返回两个数组中公共的.长度最长的子数组的长度. 示例 1: 输入: A: [1,2,3,2,1] B: [3,2,1,4,7] 输出: 3 解释 ...
- LeetCode 718最长重复子数组
题目链接:力扣 子序列默认不连续,子数组默认连续 思路: 动态规划: 定义dp数组: dp ...
- LeetCode 718. 最长重复子数组(DP)
1. 题目 给两个整数数组 A 和 B ,返回两个数组中公共的.长度最长的子数组的长度. 示例 1: 输入: A: [1,2,3,2,1] B: [3,2,1,4,7] 输出: 3 解释: 长度最长的 ...
- leetcode 718. 最长重复子数组
难度:中等 频次:53 题目:给两个整数数组 nums1 和 nums2 ,返回 两个数组中 公共的 .长度最长的子数组的长度 . 解题思路:动态规划 注意: 为什么使用动态规划?---->求最 ...
- 每日题解:LeetCode 718. 最长重复子数组
题目地址 个人博客地址 题目描述 给两个整数数组 A 和 B ,返回两个数组中公共的.长度最长的子数组的长度. 示例:输入: A: [1,2,3,2,1] B: [3,2,1,4,7] 输出:3 解释 ...
- LeetCode 718 最长重复子数组
给两个整数数组 A 和 B ,返回两个数组中公共的.长度最长的子数组的长度. A: [1,2,3,2,1] B: [3,2,1,4,7] 数组+长度,这种问题看来很多都可以采用二分搜索算法,因为长度有 ...
- 2022-2-1 leetcode.718.最长重复子数组
别人的做法 int findLength(vector<int>& A, vector<int>& B) {int len1 = A.size(), len2 ...
- leetcode(力扣) 718. 最长重复子数组 1143. 最长公共子序列 1035. 不相交的线 (动态规划)
文章目录 718. 最长重复子数组 题目描述 思路分析 完整代码 1143. 最长公共子序列 1035. 不相交的线: 这三道题思路基本一样,尤其是最后两道,代码都一样,一点不需要改的,所以放一起把. ...
最新文章
- 关于BMP格式图像的理解和读写(c++).docx
- iOS - Swift NSEnumerator		迭代器
- Linux监控服务命令
- android menu 小红点,Android自定义ActionProvider ToolBar实现Menu小红点
- staruml透明_第05组 团队项目-需求分析报告
- 白噪音和粉红噪音煲机_白噪音app体验报告
- 谷歌开源文件访问漏洞审计工具 PathAuditor(详解)
- 一张图学会python应用到excel-Python应用之------Excel操作
- 数据库 -- MySQL使用
- 北斗GNSS无人巡检车辆的高精度定位定向应用方案
- shell机器人企业微信通知
- 使用metamask发起交易的时候,交易卡在pending了怎么办?
- 算法培训(一)---排序算法
- 南宁计算机职称考试网,南宁人事考试职称网
- js 网页做一个简单的计算器
- 解决IE浏览器下载文件,文件名乱码问题(浏览器历史介绍)
- 【Android】短信应用——短信截获
- spring boot 文件下载接口
- BABYLON 三维开发工具的使用
- 无人机飞控三大算法汇总
热门文章
- Github: fatal: Unsupported SSL backend ‘“openssl”‘. Supported SSL backends: openssl schannel
- Compose实现webView文件选择
- 2021届秋招腾讯前端一面面经
- 资深研发真实编写的骚注释,你学废了么?
- ndn中自适应转发策略总结
- 常用的一些伺服电机参数
- [Python随笔]暴力解解决“崩铁”的引航罗盘解密
- 《弟子规》全集译文,为孩子的明天存下来!
- 南邮 OJ 1076 机器狗组装费用
- 2022 互联网中秋月饼大赏,腾讯送火腿,字节寓意圆满,你最钟爱哪款呢?