Leetcode刷题Python718. 最长重复子数组
Posted Better Bench
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode刷题Python718. 最长重复子数组相关的知识,希望对你有一定的参考价值。
1 题目
给两个整数数组 nums1 和 nums2 ,返回 两个数组中 公共的 、长度最长的子数组的长度 。
示例 1:
输入:nums1 = [1,2,3,2,1], nums2 = [3,2,1,4,7]
输出:3
解释:长度最长的公共子数组是 [3,2,1] 。
示例 2:
输入:nums1 = [0,0,0,0,0], nums2 = [0,0,0,0,0]
输出:5
2 解析
(1)暴力求解
时间复杂度O(n^3)
(2)动态规划
状态:重复子数组的长度
状态转移:从后往前遍历,如果元素相同,则dp等于前一个相同元素的dp加1。
d
p
[
i
]
[
j
]
=
d
p
[
i
+
1
]
[
j
+
1
]
+
1
dp[i][j] = dp[i+1][j+1]+1
dp[i][j]=dp[i+1][j+1]+1
3 Python
(1)方法一:有的例子会超时
class Solution:
def findLength(self, nums1: List[int], nums2: List[int]) -> int:
ans = 0
for i in range(len(nums1)):
for j in range(len(nums2)):
k = 0
while (i+k)<len(nums1) and (j+k)<len(nums2) and nums1[i+k] == nums2[j+k] :
k += 1
ans = max(ans, k)
return ans
(2)方法二
class Solution:
def findLength(self, nums1: List[int], nums2: List[int]) -> int:
n = len(nums1)
m = len(nums2)
dp = [[0]*(m+1) for _ in range(n+1)]
ans = 0
# 注意边界,从n-1和m-1开始,否则i+1就超出范围了
for i in range(n-1,-1,-1):
for j in range(m-1,-1,-1):
dp[i][j] = dp[i+1][j+1]+1 if nums1[i]==nums2[j] else 0
ans = max(ans,dp[i][j])
return ans
以上是关于Leetcode刷题Python718. 最长重复子数组的主要内容,如果未能解决你的问题,请参考以下文章
leetcode力扣刷题系列python——3无重复字符的最长子串