leetcode1031

 1 class Solution(object):
 2     def getMaxByCount(self,A,maxlen):
 3         curmax = 0
 4         curmax = sum(A[:maxlen])
 5         bigmax = curmax
 6         n = len(A)
 7         for i in range(maxlen,n):
 8             curmax = curmax-A[i-maxlen]+A[i]
 9             if curmax > bigmax:
10                 bigmax = curmax
11                 
12         return bigmax
13 
14 
15     def maxSumTwoNoOverlap(self, A: 'List[int]', L: int, M: int) -> int:
16         minlen = min(L,M)
17         maxlen = max(L,M)
18         n = len(A)
19         allmax = self.getMaxByCount(A,L+M)
20 
21         bigmax = sum(A[:maxlen])
22         litmax = self.getMaxByCount(A[maxlen:],minlen)
23         allmax = max(allmax,bigmax+litmax)
24 
25         for i in range(maxlen,n):
26             bigmax = bigmax - A[i-maxlen] + A[i]
27             lefttag = i-maxlen+1
28             A1 = A[0:lefttag]
29             litlen1 = self.getMaxByCount(A1,minlen)
30             righttag = i
31             A2 = A[righttag+1:]
32             litlen2 = self.getMaxByCount(A2,minlen)
33             litmax = max(litlen1,litlen2)
34             allmax = max(allmax,bigmax+litmax)
35         return allmax

getMaxByCount()方法是在A中选择连续maxlen长度的最大和。

先求L+M个连续区间的最大值,作为最基本的选择,记为allmax。

再进行一次遍历(从maxlen~n),每次选择maxlen个(L和M中更大的那个数)长度的区间,计算这个区间的和,记为bigmax。

然后将原数组一分为二,分别计算剩下的两个子集连续minlen个(L和M中更小的那个数)长度的区间的和,分别记为litlen1,litlen2。

litlen1和litlen2的更大的和,作为minlen长度的最大和,记为litmax。

每次循环内部,将allmax与bigmax+litmax进行比较,allmax中保留更大的值。

循环完毕,allmax就是最大和。

原文地址:https://www.cnblogs.com/asenyang/p/10744720.html