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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值