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

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

题目描述

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

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

难度:困难

美好而轻松的12月结束了

解题代码

// 滑动窗口
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
}

提交结果


相关文章
|
6月前
|
Go C++
【力扣】2696. 删除子串后的字符串最小长度(模拟 栈 C++ Go实现栈)
【2月更文挑战第18天】2696. 删除子串后的字符串最小长度(模拟 栈 C++ Go实现栈)
59 6
|
6月前
|
存储 算法
LeetCode刷题---209. 长度最小的子数组(双指针-滑动窗口)
LeetCode刷题---209. 长度最小的子数组(双指针-滑动窗口)
|
3月前
|
算法 Python
【Leetcode刷题Python】子数组查找
一个用于寻找给定字符串中最长重复子串的Python函数实现,采用了滑动窗口的方法来检测重复的子串。
20 1
|
3月前
|
算法 Java
LeetCode初级算法题:子数组最大平均数+二叉树的最小深度+最长连续递增序列+柠檬水找零
LeetCode初级算法题:子数组最大平均数+二叉树的最小深度+最长连续递增序列+柠檬水找零
40 0
|
5月前
|
算法 测试技术 程序员
力扣经典150题第三十题:长度最小的子数组
力扣经典150题第三十题:长度最小的子数组
28 1
|
4月前
|
存储 算法
经典的滑动窗口的题目 力扣 2799. 统计完全子数组的数目(面试题)
经典的滑动窗口的题目 力扣 2799. 统计完全子数组的数目(面试题)
技术经验解读:【LeetCode】560.SubarraySumEqualsK子数组和为K
技术经验解读:【LeetCode】560.SubarraySumEqualsK子数组和为K
|
5月前
【LeetCode刷题】滑动窗口思想解决问题:长度最小的子数组、无重复字符的最长子串
【LeetCode刷题】滑动窗口思想解决问题:长度最小的子数组、无重复字符的最长子串
|
6月前
【力扣】209. 长度最小的子数组
【力扣】209. 长度最小的子数组
|
6月前
|
索引
leetcode代码记录(最长重复子数组
leetcode代码记录(最长重复子数组
38 0