给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。
示例:
输入:
A:[1,2,3,2,1]
B:[3,2,1,4,7]
输出:3
解释:长度最长的公共子数组是 [3,2,1] 。
提示:
1<=len(A),len(B)<=10000<= A[i], B[i]<100
思路
A 与 B 的重复, 且位置不能更换
在 A 中, 也在 B 中: 连续的子数组长度。
dp[i][j]: A 中 0~i-1, B 中 0~ j-1 的连续数组的长度。
dp[i][j]: 连续数组长度, 所以 i j 来自哪里?--- i j 的上一个是多少 (i-1, j-1), 两个数组两个坐标同时变化
for i inrange(0,len(A)):for j inrange(0,len(B)):
i =0, j =0
i =0, j =1
i =0, j =2
i =1, j =1
i 01234
A 12345
j 01234
B 23451
lens =1 i =1 j =0
lens =2 i =2 j =1
lens =3 i =3 j =2
所以 i,j 从 i-1, j-1 推导而来。 dp[i][j]= dp[i-1][j-1]+1
那么(i, j-1),(i-1,j)表示什么
例如 i =2, j =1,(2,0)(1,0)与(2,1)有什么关系吗?
没有
code python
from typing import List
class Solution:
def findLength(self, nums1: List[int], nums2: List[int]) -> int:
len1, len2 = len(nums1), len(nums2)
dp = [[0 for _ in range(len2+1)] for _ in range(len1+1)]
res = 0
# dp的含义要记住
for i in range(len1):
for j in range(len2):
if nums1[i] == nums2[j]:
dp[i+1][j+1] = dp[i][j] + 1
if res < dp[i+1][j+1]:
res = dp[i+1][j+1]
return res
小结
A, B 是两个数组,所以 i,j 的变化是同时的
i-1,j-1----> i,j
i-2,j-1----> i-1,j
i-1,j-2----> i,j-1
连续
dp[j]:0-j 包括j的最大连续和
dp[j]= dp[j-1]+ nums[j], nums[j],
lens =len(nums)
dp =[0for _ in eange(lens)]
dp[0]=-2
res =0
dp[1]=,-2+1,1=1 res =1
dp[2]=1-3,-3=-2
dp[3]=-2+4,4=1 res =4
dp[4]=4-1,-1=3 res =3
dp[5]=3+2,2=5 res =5
dp[6]=6,1=6 res =6
dp[7]=1,-5=1
dp[8]=1+4,4=5
code python
classSolution:defmaxSubArray(self, nums: List[int])->int:
lens =len(nums)if lens ==1:return nums[0]
dp =[0for _ inrange(lens)]
dp[0]= nums[0]
res = nums[0]for i inrange(1, lens):
dp[i]=max(dp[i-1]+ nums[i], nums[i])if res < dp[i]:
res = dp[i]return res
贪心 code python
classSolution:defmaxSubArray(self, nums: List[int])->int:
res =float('-inf')
pre_sum =0for i inrange(0,len(nums)):
pre_sum += nums[i]if pre_sum > res:
res = pre_sum
if pre_sum <=0:
pre_sum =0return res