【Leetcode_总结】1031. 两个非重叠子数组的最大和- python

Q:

给出非负整数数组 A ,返回两个非重叠(连续)子数组中元素的最大和,子数组的长度分别为 L 和 M。(这里需要澄清的是,长为 L 的子数组可以出现在长为 M 的子数组之前或之后。)

从形式上看,返回最大的 V,而 V = (A[i] + A[i+1] + ... + A[i+L-1]) + (A[j] + A[j+1] + ... + A[j+M-1]) 并满足下列条件之一:

  • 0 <= i < i + L - 1 < j < j + M - 1 < A.length
  • 0 <= j < j + M - 1 < i < i + L - 1 < A.length.

示例 1:

输入:A = [0,6,5,2,2,5,1,9,4], L = 1, M = 2
输出:20
解释:子数组的一种选择中,[9] 长度为 1,[6,5] 长度为 2。

链接:https://leetcode-cn.com/problems/maximum-sum-of-two-non-overlapping-subarrays/

思路:暴力求解

代码:

class Solution:
    def maxSumTwoNoOverlap(self, A: List[int], L: int, M: int) -> int:
        max0 = [0,0]
        max_total0 = 0
        for i in range(len(A)-L + 1):
            if sum(A[i:i+L]) > max0[0]:
                max0[0] = sum(A[i:i+L])
                max0[1] = i
                new = A[:max0[1]] + A[max0[1]+ L:]
                max1 = [0,0]
                for i in range(len(new)- M + 1):
                    if  sum(new[i:i+M]) > max1[0]:
                        max1[0] = sum(new[i:i+M])
                if(max0[0]+max1[0]) > max_total0:
                    max_total0 = max0[0]+max1[0]
        max_total1 = 0
        max2 = [0,0]
        for i in range(len(A)-M + 1):
            if sum(A[i:i+M]) > max2[0]:
                max2[0] = sum(A[i:i+M])
                max2[1] = i
                new = A[:max2[1]] + A[max2[1]+ M:]
                max3 = [0,0]
                for i in range(len(new)- L + 1):
                    if  sum(new[i:i+L]) > max3[0]:
                        max3[0] = sum(new[i:i+L])
                if(max2[0]+max3[0]) > max_total1:
                    max_total1 = max2[0]+max3[0]
        
        return max(max_total0,max_total1)

猜你喜欢

转载自blog.csdn.net/maka_uir/article/details/89675338