栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

力扣每日一题2021-12-08三个无重叠子数组的最大和

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

力扣每日一题2021-12-08三个无重叠子数组的最大和

三个无重叠子数组的最大和
  • 689.三个无重叠子数组的最大和
    • 题目描述
    • 思路
      • 滑动窗口
        • Java实现
        • Python实现


689.三个无重叠子数组的最大和 题目描述

三个无重叠子数组的最大和


思路 滑动窗口

使用3个大小为k的滑动窗口。设 s u m 1 sum_1 sum1​为第一个滑动窗口的元素和,该滑动窗口从[0, k-1]开始; s u m 2 sum_2 sum2​为第二个滑动窗口的元素和,该滑动窗口从[k, 2k-1]开始; s u m 3 sum_3 sum3​位第三个滑动窗口的元素和,该滑动窗口从[2k, 3*k-1]开始。
同时向右滑动三个滑动窗口,每次滑动时,计算当前 m a x S u m 12 maxSum_{12} maxSum12​与 s u m 3 sum_3 sum3​之和。统计这一过程中的 m a x S u m 12 + s u m 3 maxSum_{12}+sum_3 maxSum12​+sum3​的最大值及对应位置。
而 m a x S u m 12 maxSum_{12} maxSum12​可以由 m a x S u m 1 maxSum_1 maxSum1​和 s u m 2 sum_2 sum2​的和来求。
题目还要求使用最小字典序,因为是从左往右遍历,所以当且仅当元素和大于最大元素和时,才修改最大元素和以及对应位置。

Java实现

class Solution {
    public int[] maxSumOfThreeSubarrays(int[] nums, int k) {
        int[] ans = new int[3];
        int sum1 = 0, maxSum1 = 0, maxSum1Idx = 0;
        int sum2 = 0, maxSum12 = 0, maxSum12Idx1 = 0, maxSum12Idx2 = 0;
        int sum3 = 0, maxTotal = 0;
        for (int i = k * 2; i < nums.length; ++i) {
            sum1 += nums[i - k * 2];
            sum2 += nums[i - k];
            sum3 += nums[i];
            if (i >= k * 3 - 1) {
                if (sum1 > maxSum1) {
                    maxSum1 = sum1;
                    maxSum1Idx = i - k * 3 + 1;
                }
                if (maxSum1 + sum2 > maxSum12) {
                    maxSum12 = maxSum1 + sum2;
                    maxSum12Idx1 = maxSum1Idx;
                    maxSum12Idx2 = i - k * 2 + 1;
                }
                if (maxSum12 + sum3 > maxTotal) {
                    maxTotal = maxSum12 + sum3;
                    ans[0] = maxSum12Idx1;
                    ans[1] = maxSum12Idx2;
                    ans[2] = i - k + 1;
                }
                sum1 -= nums[i - k * 3 + 1];
                sum2 -= nums[i - k * 2 + 1];
                sum3 -= nums[i - k + 1];
            }
        }
        return ans;
    }
}
Python实现

class Solution:
    def maxSumOfThreeSubarrays(self, nums: List[int], k: int) -> List[int]:
        ans = []
        sum1, maxSum1, maxSum1Idx = 0, 0, 0
        sum2, maxSum12, maxSum12Idx = 0, 0, ()
        sum3, maxTotal = 0, 0
        for i in range(k * 2, len(nums)):
            sum1 += nums[i - k * 2]
            sum2 += nums[i - k]
            sum3 += nums[i]
            if i >= k * 3 - 1:
                if sum1 > maxSum1:
                    maxSum1 = sum1
                    maxSum1Idx = i - k * 3 + 1
                if maxSum1 + sum2 > maxSum12:
                    maxSum12 = maxSum1 + sum2
                    maxSum12Idx = (maxSum1Idx, i - k * 2 + 1)
                if maxSum12 + sum3 > maxTotal:
                    maxTotal = maxSum12 + sum3
                    ans = [*maxSum12Idx, i - k + 1]
                sum1 -= nums[i - k * 3 + 1]
                sum2 -= nums[i - k * 2 + 1]
                sum3 -= nums[i - k + 1]
        return ans
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/643416.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号