题目可以用暴力方式求解,不过会卡在第80个TC上,TLE。
class Solution:
def maxSum(self, nums1: List[int], nums2: List[int]) -> int:
Mod = 10**9 + 7
if len(nums1) < len(nums2):
nums1, nums2 = nums2, nums1
res1 = []
sublist1 = []
res2 = []
sublist2 = []
for index, num in enumerate(nums1):
if num in nums2:
res1.append(index)
res2.append(nums2.index(num))
res1.append(len(nums1)+1)
res2.append(len(nums2)+1)
last1 = 0
last2 = 0
for index1,index2 in zip(res1,res2):
sublist1.append(sum(nums1[last1:index1+1]))
last1 = index1 + 1
sublist2.append(sum(nums2[last2:index2+1]))
last2 = index2 + 1
res =0
for i in range(len(sublist1)):
res += max(sublist1[i], sublist2[i])
return res%Mod
既然TLE,可以优化的地儿有查找每个相同数字在各自array中的位置的过程。用bisect查找可以加速。不过要注意的是bisect找到的位置是这个相同数字的位置的下一位,所以更新位置时和截取subarray时不用+1。以及相同数字求取后,要排序,不然会乱。。
class Solution:
def maxSum(self, nums1: List[int], nums2: List[int]) -> int:
Mod = 10**9 + 7
if len(nums1) < len(nums2):
nums1, nums2 = nums2, nums1
samenumber = sorted(set(nums1)&set(nums2))
if not samenumber:return max(sum(nums1), sum(nums2))%Mod
last1 = 0
last2 = 0
res = 0
for num in samenumber:
index1 = bisect.bisect(nums1, num, last1)
index2 = bisect.bisect(nums2, num, last2)
res += max( sum(nums1[last1:index1]), sum(nums2[last2:index2]))
last1 = index1
last2 = index2
res += max( sum(nums1[last1:]), sum(nums2[last2:]))
return res%Mod