题目描述
- 给定一个数组和两个长度,找到两个符合长度的不重合的连续子数组,使其和最大
示例
输入:nums = [0,6,5,2,2,5,1,9,4], firstLen = 1, secondLen = 2
输出:20
解释:[6, 5] + [9]
输入:nums = [3,8,1,3,2,1,8,9,0], firstLen = 3, secondLen = 2
输出:29
输入:nums = [2,1,5,6,0,9,5,0,3,8], firstLen = 4, secondLen = 3
输出:31
题解
- 思路:前缀和
- 不妨设 子数组a 在前,子数组b 在后
- 当 b 固定时,a 在前面范围中取最大,就得到了当前 b 对应的最大值
- 对于每一个 b,都找到最大的 a,最后取一个 max 即可
- 又是非常像第一题《两数之和》
func maxSumTwoNoOverlap(nums []int, firstLen int, secondLen int) int {return max(help(nums, firstLen, secondLen), help(nums, secondLen, firstLen))
}func help(nums []int, a, b int) (res int) {n := len(nums)s := make([]int, n + 1)for i := 1; i <= n; i ++ { s[i] = s[i - 1] + nums[i - 1] }for i, maxa := a + b, 0; i <= n; i ++ {maxa = max(maxa, s[i - b] - s[i - b - a])res = max(res, maxa + s[i] - s[i - b])}return
}