718. Maximum Length of Repeated Subarray 最长重复子数组
Title
给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。
示例 1:
输入:
A: [1,2,3,2,1]
B: [3,2,1,4,7]
输出: 3
**解释: **
长度最长的公共子数组是 [3, 2, 1]。
说明:
1 <= len(A), len(B) <= 1000
0 <= A[i], B[i] < 100
暴力
Solve
很容易就可以想到开一个暴力解法,即枚举数组A中的起始位置i与数据B中的起始位置j,然后计算A[i:]与B[j:]的最长公共前缀k,最终答案即为所有的最长公共前缀的最大值。
Code
def findLength_violence(self, A: List[int], B: List[int]) -> int:lengthA, lengthB, ans = len(A), len(B), 0for i in range(lengthA):for j in range(lengthB):k = 0while i + k < lengthA and j + k < lengthB and A[i + k] == B[j + k]:k += 1ans = max(ans, k)return ans
复杂度分析
时间复杂度:O(N3)
空间复杂度:O(1)
动态规划
Solve
暴力解法的过程中,最坏情况下对于任意i与j,A[i]与B[j]比较了min(i+1, j+1)次,这也是导致暴力解法时间复杂度过高的根本原因。
我们可以优化这一过程,使得任意一对A[i]和B[i]都只被比较一次,这样我们自然而然想到利用这一次的比较结果,如果A[i]==B[j],那么我们知道A[i:]和B[j:]的最长公共前缀为A[i+1:]与B[j+1:]的最长公共前缀+1,否则我们知道A[i:]和B[j:]的最长公共前缀为零。
这样我们就可以提出动态规划的解法:令dp[i][j]表示A[i:]和B[j:]的最长公共前缀,那么答案即为所有dp[i][j]中的最大值,如果A[i] == B[j],那么dp[i][j] = dp[i + 1][j + 1] + 1,否则dp[i][j] = 0。
考虑到这里dp[i][j]的值从dp[i + 1][j + 1]转移得到,所以我们需要倒过来,首先计算dp[len(A) - 1][len(B) - 1],最后计算dp[0][0]。
Code
ans, lengthA, lengthB = 0, len(A), len(B)dp = [[0] * (lengthB + 1) for _ in range(lengthA + 1)]for i in range(lengthA - 1, -1, -1):for j in range(lengthB - 1, -1, -1):dp[i][j] = dp[i + 1][j + 1] + 1 if A[i] == B[j] else 0ans = max(ans, dp[i][j])return ans
复杂度分析
时间复杂度: O(N×M)。
空间复杂度: O(N×M)。
N 表示数组 A 的长度,M 表示数组 B 的长度。
空间复杂度还可以再优化,利用滚动数组可以优化到 O(min(N,M))。
718. Maximum Length of Repeated Subarray 最长重复子数组相关推荐
- leetcode 718. Maximum Length of Repeated Subarray | 718. 最长重复子数组(动态规划)
题目 https://leetcode.com/problems/maximum-length-of-repeated-subarray/ 题解 Dynamic Programming [Accept ...
- 求两个数组的最长重复子数组 Maximum Length of Repeated Subarray
为什么80%的码农都做不了架构师?>>> 问题: Given two integer arrays A and B, return the maximum length of ...
- arry-718 Maximum Length of Repeated Subarray
题目:Input: A: [1,2,3,2,1] B: [3,2,1,4,7] Output: 3 Explanation: The repeated subarray with maximum le ...
- 两个数组进行比较_LeetCode 718. 最长重复子数组 | Python
718. 最长重复子数组 题目来源:力扣(LeetCode)https://leetcode-cn.com/problems/maximum-length-of-repeated-subarray 题 ...
- Java实现 LeetCode 718 最长重复子数组(动态规划)
718. 最长重复子数组 给两个整数数组 A 和 B ,返回两个数组中公共的.长度最长的子数组的长度. 示例 1: 输入: A: [1,2,3,2,1] B: [3,2,1,4,7] 输出: 3 解释 ...
- 力扣-718最长重复子数组(dp)
力扣-718最长重复子数组 1.题目 给两个整数数组 nums1 和 nums2 ,返回 两个数组中 公共的 .长度最长的子数组的长度 . 示例 1: 输入:nums1 = [1,2,3,2,1], ...
- leetcode(力扣) 718. 最长重复子数组 1143. 最长公共子序列 1035. 不相交的线 (动态规划)
文章目录 718. 最长重复子数组 题目描述 思路分析 完整代码 1143. 最长公共子序列 1035. 不相交的线: 这三道题思路基本一样,尤其是最后两道,代码都一样,一点不需要改的,所以放一起把. ...
- 718. 最长重复子数组(JavaScript)
//dp[i][j] :以下标i - 1为结尾的A,和以下标j - 1为结尾的B,最长重复子数组长度为dp[i][j]. var findLength = function(nums1, nums2) ...
- LeetCode 718最长重复子数组
题目链接:力扣 子序列默认不连续,子数组默认连续 思路: 动态规划: 定义dp数组: dp ...
最新文章
- Mavan的配置,以及与IDEA版本不一致,解决办法
- 类型转换出现在赋值运算符左边的情况
- MATLAB元胞自动机报告,元胞自动机概述与MATLAB实现
- linux usb不识别,求助:USB无法识别
- 鼠标点击后的CSS3跑马灯效果
- Linux内核协议栈分析之——tcp/ip通信并不神秘
- 如何深入浅出地讲解麦克斯韦方程组
- 中国科技统计年鉴面板数据Excel格式(2009-2019年)
- 四足鼎立,北京互联网产业地图
- 如何通过文献名称获取相应的DOI号?
- wiresshark抓包
- Linux rescue
- Centos7 | etc 目录下文件详解
- 保研英语自我介绍计算机,计算机保研面试英文自我介绍
- 通过网址自动网页截图(Selenium实现)
- 高德地图自定义地图怎么去除最上边这个默认的蓝色天空?太丑了!!
- Oceanbase 扩容TPC-H测试
- 如何免费学习Python?分享我自己的学习经验
- 端到端的框架DeepInf
- Linux -- Ubuntu下载deepin wine依赖问题笔记
热门文章
- 微信小程序使用adb工具
- OpenStack概念架构简述
- [转载]ASP.NET中IsPostBack详解
- pytest入门学习(2)
- ytu 1980:小鼠迷宫问题(DFS 深度优先搜索)
- HDU 2115 -I Love This Game
- ajax 填充,自动填充ajax请求
- python的基本语法数据类型有那些_python语法基础(基本数据类型)
- vue中模板编译compiler源码详解
- Java黑皮书课后题第8章:**8.4(计算每个雇员每周工作的小时数)假定所有雇员每周工作的小时数存储在一个二维数组中。1行包含7列,记录了一个雇员7天的工作小时数。编写一个程序,按照总工时降序显示