class Solution:
"""
@param: nums: A list of integers
@return: An integer denotes the sum of max two non-overlapping subarrays
"""
def maxTwoSubArrays(self, nums):
# write your code here
if len(nums) == 2:
return nums[0] + nums[1]
lfetlist = [0 for i in range(len(nums))] # 做左遍历,找到每个数字之前最大子数组和
maxl = -99999
s1 = 0
n = len(nums)
for i in range(n):
if s1 < 0:
s1 = nums[i]
else:
s1 = s1 + nums[i]
maxl = max(maxl,s1)
lfetlist[i] = maxl
rightlist = [0 for i in range(len(nums))] # 做右遍历,找到每个数字之前最大子数组和
max2 = -99999
s2 = 0
for i in range(n-1,-1,-1):
if s2 < 0:
s2 = nums[i]
else:
s2 = s2 + nums[i]
max2 = max(max2,s2)
rightlist[i] = max2
res = -999999999
for i in range(1,n): # 交叉求两个最大数组的和,避免重复
ans = lfetlist[i-1] + rightlist[i]
if ans > res:
res = ans
return res
做此题之前,一定要先去弄明白最大子数组和 的问题
给定一个整数数组,找出两个 不重叠 子数组使得它们的和最大。
每个子数组的数字在数组中的位置应该是连续的。
返回最大的和。
样例
给出数组 [1, 3, -1, 2, -1, 2]
这两个子数组分别为 [1, 3]
和 [2, -1, 2]
或者 [1, 3, -1, 2]
和 [2]
,它们的最大和都是 7
挑战
要求时间复杂度为 O(n)
注意事项
子数组最少包含一个数()