lc1031-两个非重叠子数组的最大和

题目描述

  • 给定一个数组和两个长度,找到两个符合长度的不重合的连续子数组,使其和最大

示例

输入: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
}
posted @ 2025-09-18 23:05  余越  阅读(6)  评论(0)    收藏  举报