# 1031. Maximum Sum of Two Non-Overlapping Subarrays
###### tags: `Leetcode` `Medium` `Prefix Sum` `Sliding Window`
Link: https://leetcode.com/problems/maximum-sum-of-two-non-overlapping-subarrays/description/
## 思路
思路参考[这里](https://leetcode.com/problems/maximum-sum-of-two-non-overlapping-subarrays/solutions/279221/java-python-3-two-easy-dp-codes-w-comment-time-o-n-no-change-of-input/)
分情况讨论 firstLen在左边和firstLen在右边的情况
随着指针移动 记录左边的array的最大值 用最大值加上右边的array的sum 以此找最大值
## Code
Prefix Sum
```java=
class Solution {
public int maxSumTwoNoOverlap(int[] nums, int firstLen, int secondLen) {
int n = nums.length;
int[] prefixSum = new int[n+1];
for(int i=0; i<n; i++) prefixSum[i+1] = prefixSum[i]+nums[i];
return Math.max(maxSum(prefixSum, firstLen, secondLen), maxSum(prefixSum, secondLen, firstLen));
}
public int maxSum(int[] prefixSum, int L, int M){
int ans = 0;
int maxL = 0;
for(int i=L+M; i<prefixSum.length; i++){
maxL = Math.max(maxL, prefixSum[i-M]-prefixSum[i-M-L]);
ans = Math.max(ans, maxL+prefixSum[i]-prefixSum[i-M]);
}
return ans;
}
}
```
```python=
class Solution:
def maxSumTwoNoOverlap(self, nums: List[int], firstLen: int, secondLen: int) -> int:
def maxSum(L: int, M: int):
ans = maxL = 0
for i in range(L+M, len(prefixSum)):
maxL = max(maxL, prefixSum[i-M]-prefixSum[i-M-L])
ans = max(ans, maxL+prefixSum[i]-prefixSum[i-M])
return ans
prefixSum = [0]*(len(nums)+1)
for i, a in enumerate(nums):
prefixSum[i+1] = prefixSum[i]+a
return max(maxSum(firstLen, secondLen), maxSum(secondLen, firstLen))
```
Sliding Window
```python=
class Solution:
def maxSumTwoNoOverlap(self, nums: List[int], firstLen: int, secondLen: int) -> int:
def maxSum(L: int, M: int):
sumL = sumM = 0
for i in range(0, L+M):
if i<L: sumL += nums[i]
else: sumM += nums[i]
maxL = sumL
ans = sumL+sumM
for i in range(L+M, len(nums)):
sumL += nums[i-M]-nums[i-M-L]
sumM += nums[i]-nums[i-M]
maxL = max(maxL, sumL)
ans = max(ans, maxL+sumM)
return ans
return max(maxSum(firstLen, secondLen), maxSum(secondLen, firstLen))
```