力扣1031题
题目描述:两个非重叠了数组的最大和
给你一个整数数组 nums 和两个整数 firstLen 和 secondLen,请你找出并返回两个非重叠 子数组 中元素的最大和,长度分别为 firstLen 和 secondLen 。
长度为 firstLen 的子数组可以出现在长为 secondLen 的子数组之前或之后,但二者必须是不重叠的。
子数组是数组的一个 连续 部分。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/maximum-sum-of-two-non-overlapping-subarrays
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解思路:
- 借助一个求和数组s[n+1],长为原数组+1,s[i]表示nums的前(i+1)个元素的和;s[6]表示nums中前6个元素的和;
s[i]-s[i-a]
即为nums中a个连续元素的和
,用t来表示,t+s[i+b]-s[i]即表示nums中a个连续元素的和 和 b个连续元素的和。- 借助 Math.max(a,b) 求a和b的最大值
class Solution {
private int[] s;
private int n;
public int maxSumTwoNoOverlap(int[] nums, int firstLen, int secondLen) {
n= nums.length;
//借助辅助求和数组
s = new int[n+1];
for(int i=1;i<s.length;i++){
s[i] = s[i-1] + nums[i-1];//s[i]表示nums[i]前i个元素的和
}
//借助Math.max(a,b)求最大值
return Math.max(f(firstLen, secondLen), f(secondLen, firstLen));
}
private int f(int a, int b){
int ans = 0;//最大值的结果
for(int i=a, t=0;(i+b)<n+1; i++){//t用来统计a的和
t = Math.max(t, s[i]-s[i-a]);
ans = Math.max(ans, t+s[i+b]-s[i]);
}
return ans;
}
}