Leetcode 1537. Get the Maximum Score [Python]

题目可以用暴力方式求解,不过会卡在第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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值