題目描述:給你兩個陣列 nums1 和 nums2 。
請你返回 nums1 和 nums2 中兩個長度相同的 非空 子串行的最大點積。
陣列的非空子序列是通過刪除原陣列中某些元素(可能乙個也不刪除)後剩餘數字組成的序列,但不能改變量字間相對順序。比方說,[2,3,5] 是 [1,2,3,4,5] 的乙個子串行而 [1,5,3] 不是。
解題思路:動態規劃dp[i][j]
表示nums1[:i+1]
和nums2[:j+1]
的長度相同的非空子序列的最大點積,他的結果一共分為三種情況(1)最大點積沒有用到nums1[i]
,那麼結果就是dp[i-1][j]
(2)如果最大點積沒有用到nums2[j]
,那麼結果就是dp[i][j-1]
,(3)同時用到了nums1[i]和nums2[j]
,那麼結果就是nums1[i]*nums2[j]再加上dp[i-1][j-1],如果它大於零的話
,**如下:
class
solution
:def
maxdotproduct
(self, nums1: list[
int]
, nums2: list[
int])-
>
int:
size1 =
len(nums1)
size2 =
len(nums2)
dp =[[
0]* size2 for _ in
range
(size1)
] dp[0]
[0]= nums1[0]
* nums2[0]
for i in
range(1
, size2)
: dp[0]
[i]=
max(dp[0]
[i-1
], nums2[i]
*nums1[0]
)for i in
range(1
, size1)
: dp[i][0
]=max(dp[i-1]
[0], nums1[i]
*nums2[0]
)for i in
range(1
, size1)
:for j in
range(1
, size2)
: dp[i]
[j]=
max(dp[i-1]
[j], dp[i]
[j-1
], nums1[i]
*nums2[j]
+(dp[i-1]
[j-1
]if dp[i-1]
[j-1
]>
0else0)
)return dp[-1
][-1
]
兩個子串行的最大點積
給你兩個陣列nums1和nums2。請你返回nums1和nums2中兩個長度相同的非空子串行的最大點積。陣列的非空子序列是通過刪除原陣列中某些元素 可能乙個也不刪除 後剩餘數字組成的序列,但不能改變量字間相對順序。比方說,2,3,5 是 1,2,3,4,5 的乙個子串行而 1,5,3 不是。示例 1...
Leetcode之兩個子串行的最大點積
題目 給你兩個陣列 nums1 和 nums2 請你返回 nums1 和 nums2 中兩個長度相同的 非空 子串行的最大點積。陣列的非空子序列是通過刪除原陣列中某些元素 可能乙個也不刪除 後剩餘數字組成的序列,但不能改變量字間相對順序。比方說,2,3,5 是 1,2,3,4,5 的乙個子串行而 1...
阿里筆試題 求兩個子串行的最大連續子串行
給定乙個query和乙個text,均由小寫字母組成。要求在text中找出以相同的順序連續出如今query中的最長連續字母序列的長度。比如。query為 acbac text為 acaccbabb 那麼text中的 cba 為最長的連續出如今query中的字母序列,因此。返回結果應該為其長度3。請注意...