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 最长重复子数组相关推荐

  1. leetcode 718. Maximum Length of Repeated Subarray | 718. 最长重复子数组(动态规划)

    题目 https://leetcode.com/problems/maximum-length-of-repeated-subarray/ 题解 Dynamic Programming [Accept ...

  2. 求两个数组的最长重复子数组 Maximum Length of Repeated Subarray

    为什么80%的码农都做不了架构师?>>>    问题: Given two integer arrays A and B, return the maximum length of ...

  3. 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 ...

  4. 两个数组进行比较_LeetCode 718. 最长重复子数组 | Python

    718. 最长重复子数组 题目来源:力扣(LeetCode)https://leetcode-cn.com/problems/maximum-length-of-repeated-subarray 题 ...

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

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

  6. 力扣-718最长重复子数组(dp)

    力扣-718最长重复子数组 1.题目 给两个整数数组 nums1 和 nums2 ,返回 两个数组中 公共的 .长度最长的子数组的长度 . 示例 1: 输入:nums1 = [1,2,3,2,1], ...

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

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

  8. 718. 最长重复子数组(JavaScript)

    //dp[i][j] :以下标i - 1为结尾的A,和以下标j - 1为结尾的B,最长重复子数组长度为dp[i][j]. var findLength = function(nums1, nums2) ...

  9. LeetCode 718最长重复子数组

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

最新文章

  1. Mavan的配置,以及与IDEA版本不一致,解决办法
  2. 类型转换出现在赋值运算符左边的情况
  3. MATLAB元胞自动机报告,元胞自动机概述与MATLAB实现
  4. linux usb不识别,求助:USB无法识别
  5. 鼠标点击后的CSS3跑马灯效果
  6. Linux内核协议栈分析之——tcp/ip通信并不神秘
  7. 如何深入浅出地讲解麦克斯韦方程组
  8. 中国科技统计年鉴面板数据Excel格式(2009-2019年)
  9. 四足鼎立,北京互联网产业地图
  10. 如何通过文献名称获取相应的DOI号?
  11. wiresshark抓包
  12. Linux rescue
  13. Centos7 | etc 目录下文件详解
  14. 保研英语自我介绍计算机,计算机保研面试英文自我介绍
  15. 通过网址自动网页截图(Selenium实现)
  16. 高德地图自定义地图怎么去除最上边这个默认的蓝色天空?太丑了!!
  17. Oceanbase 扩容TPC-H测试
  18. 如何免费学习Python?分享我自己的学习经验
  19. 端到端的框架DeepInf
  20. Linux -- Ubuntu下载deepin wine依赖问题笔记

热门文章

  1. 微信小程序使用adb工具
  2. OpenStack概念架构简述
  3. [转载]ASP.NET中IsPostBack详解
  4. pytest入门学习(2)
  5. ytu 1980:小鼠迷宫问题(DFS 深度优先搜索)
  6. HDU 2115 -I Love This Game
  7. ajax 填充,自动填充ajax请求
  8. python的基本语法数据类型有那些_python语法基础(基本数据类型)
  9. vue中模板编译compiler源码详解
  10. Java黑皮书课后题第8章:**8.4(计算每个雇员每周工作的小时数)假定所有雇员每周工作的小时数存储在一个二维数组中。1行包含7列,记录了一个雇员7天的工作小时数。编写一个程序,按照总工时降序显示