zl程序教程

您现在的位置是:首页 >  其他

当前栏目

每日一题---689. 三个无重叠子数组的最大和[力扣][Go]

2023-03-14 22:59:50 时间

题目描述

给你一个整数数组 nums 和一个整数 k ,找出三个长度为 k 、互不重叠、且 3 * k 项的和最大的子数组,并返回这三个子数组。

以下标的数组形式返回结果,数组中的每一项分别指示每个子数组的起始位置(下标从 0 开始)。如果有多个结果,返回字典序最小的一个。

难度:困难

美好而轻松的12月结束了

image

解题代码

// 滑动窗口
func maxSumOfThreeSubarrays(nums []int, k int) (ans []int) {
    // sum1 是当前滑动窗口中数的和
    // maxSum1 是经历过的所有窗口和最大的数
    // maxSum1Idx 是拥有最大和窗口的下标
    var sum1, maxSum1, maxSum1Idx int
    // maxSum12 是两个窗口经历过最大的数的和
    // maxSum12Idx1 是使第一个窗口和第二个窗口中的数总和最大的第一个窗口的下标
    // maxSum12Idx1 是使第一个窗口和第二个窗口中的数总和最大的第二个窗口的下标
    var sum2, maxSum12, maxSum12Idx1, maxSum12Idx2 int
    // maxTotal 是三个窗口中的数总和
    var sum3, maxTotal int
    for i := k * 2; i < len(nums); i++ {
        // 窗口滑动
        sum1 += nums[i-k*2]
        sum2 += nums[i-k]
        sum3 += nums[i]
        if i >= k*3-1 {
            // 判断sum1是否为最大值,并记录下标
            if sum1 > maxSum1 {
                maxSum1 = sum1
                maxSum1Idx = i - k*3 + 1
            }
            // 判断是maxSum12否为最大值,并记录下标
            if maxSum1+sum2 > maxSum12 {
                maxSum12 = maxSum1 + sum2
                maxSum12Idx1, maxSum12Idx2 = maxSum1Idx, i-k*2+1
            }
            // 判断maxTotal是否为最大值,并录入下标
            if maxSum12+sum3 > maxTotal {
                maxTotal = maxSum12 + sum3
                ans = []int{maxSum12Idx1, maxSum12Idx2, i - k + 1}
            }
            // 将窗口边界的值去除
            sum1 -= nums[i-k*3+1]
            sum2 -= nums[i-k*2+1]
            sum3 -= nums[i-k+1]
        }
    }
    return
}

提交结果

image