【每日一题】三个无重叠子数组的最大和

文章目录

  • Tag
  • 题目来源
  • 题目解读
  • 解题思路
    • 方法一:滑动窗口
  • 写在最后

Tag

【滑动窗口】【数组】【2023-11-19】


题目来源

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


题目解读


解题思路

方法一:滑动窗口

单个子数组的最大和

我们先来考虑一个长度为 k 的子数组的最大值与取得最大值时的初始位置。可以使用固定长度的滑动窗口来解决本题。

滑动窗口是数组和字符串等问题中常用的一个概念。利用滑动窗口可以去掉重复的运算,从而降低时间复杂度。滑动窗口的 “滑动” 指的是窗口每次向右移动一个位置,那么该窗口内的就会增加原窗口右侧的元素,并且会减少原窗口左端点的元素。

我们从数组 [0, k-1] 区间开始,不断地向右滑动窗口,直至窗口右端点到达数组末尾时停止。统计这一过程中长度为 k 的窗口内元素和 sum1 的最大值(记为 maxSum1)及其对应位置。

实现代码为:

class Solution {
public:vector<int> maxSumOfOneSubarray(vector<int> &nums, int k) {vector<int> ans;int sum1 = 0, maxSum1 = 0;for (int i = 0; i < nums.size(); ++i) {sum1 += nums[i];if (i >= k - 1) {if (sum1 > maxSum1) {maxSum1 = sum1;ans = {maxSum1, i - k + 1};}sum1 -= nums[i - k + 1];}}return ans;}
};

两个子数组的最大和

我们可以仿照 单个子数组的最大和 问题的解题方法,使用两个固定长度的滑动窗口来求解 两个子数组的最大和

sum1 为第一个滑动窗口的元素和,该滑动窗口从 [0, k - 1] 开始,sum2 为第二个滑动窗口的元素和,该滑动窗口从 [k, 2*k - 1] 开始。我们同时向右滑动这两个窗口,并维护 sum1 的最大值 maxSum1 及其对应位置。每次滑动时,记录当前的 maxSum1sum2 之和。统计这一过程中的 maxSum1 + sum2 的最大值(记作 maxSum12)及其对应位置。

实现代码为:

class Solution {
public:vector<int> maxSumOfTwoSubarrays(vector<int> &nums, int k) {vector<int> ans;int sum1 = 0, maxSum1 = 0, maxSum1Idx = 0;int sum2 = 0, maxSum12 = 0;for (int i = k; i < nums.size(); ++i) {sum1 += nums[i - k];sum2 += nums[i];if (i >= k * 2 - 1) {if (sum1 > maxSum1) {maxSum1 = sum1;maxSum1Idx = i - k * 2 + 1;}if (maxSum1 + sum2 > maxSum12) {maxSum12 = maxSum1 + sum2;ans = {maxSum1Idx, i - k + 1};}sum1 -= nums[i - k * 2 + 1];sum2 -= nums[i - k + 1];}}return ans;}
};

三个子数组的最大和

在本题中,可以使用三个长度为 k 的滑动窗口。设 sum1 为第一个滑动窗口的元素和,该滑动窗口从 [0, k - 1] 开始,sum2 为第二个滑动窗口的元素和,该滑动窗口从 [k, 2*k - 1] 开始,sum3 为第三个滑动窗口的元素和,该滑动窗口从 [2*k, 3*k - 1] 开始。

我们同时向右滑动这三个窗口,并维护 maxSum12 及其对应位置。每次滑动时,记录当前的 maxSum12sum3 之和。统计这一过程中的 maxSum12 + sum3 的最大值(记作 maxTotal)及其对应位置。

对于题目要求的最小字典序,由于我们是从左向右遍历的,并且仅当元素和超过最大元素和时才修改最大元素和,从而保证求出来的下标列表是字典序最小的。

复杂度分析

class Solution {
public:vector<int> maxSumOfThreeSubarrays(vector<int>& nums, int k) {vector<int> res;int sum1 = 0, maxSum1 = 0, maxSum1Idx = 0;int sum2 = 0, maxSum12 = 0, maxSum12Idx1 = 0, maxSum12Idx2 = 0;int sum3 = 0, maxTotal = 0;for (int i = 2 * k; i < nums.size(); ++i) {sum1 += nums[i - 2 * k];sum2 += nums[i - k];sum3 += nums[i];if (i >= 3 * k - 1) {if (sum1 > maxSum1) {maxSum1 = sum1;maxSum1Idx = i - 3 * k + 1; }if (maxSum1 + sum2 > maxSum12) {maxSum12 = maxSum1 + sum2;maxSum12Idx1 = maxSum1Idx;maxSum12Idx2 = i - 2 * k + 1;}if (maxSum12 + sum3 > maxTotal) {maxTotal = maxSum12 + sum3;res = {maxSum12Idx1, maxSum12Idx2, i - k + 1};}sum1 -= nums[i - 3 * k + 1];sum2 -= nums[i - 2 * k + 1];sum3 -= nums[i -  k + 1];}}return res;}
};

复杂度分析

时间复杂度: O ( n ) O(n) O(n)

空间复杂度: O ( 1 ) O(1) O(1)


写在最后

如果文章内容有任何错误或者您对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。

如果大家有更优的时间、空间复杂度方法,欢迎评论区交流。

最后,感谢您的阅读,如果感到有所收获的话可以给博主点一个 👍 哦。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/195941.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redux-状态管理组件

一、简介 react中的状态只属于某个组件。而Redux是一个全局管理js状态的架构&#xff0c;让组件通信更加容易。 之前是状态在所有组件间传递&#xff0c;而redux通过store来实现这个功能。 Redux特性&#xff1a; 1.Single source Of truth&#xff0c;通过store唯一维护状态…

电子学会C/C++编程等级考试2022年03月(一级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536输入 只有一行,一个双精度浮点数。输出 一行,保留8位小数的浮点数。样例输入 3.1415926535798932样例输出 3.1…

【Android】使用Retrofit2发送异步网络请求的简单案例

添加网络权限到AndroidManifest.xml清单文件 为了让你的Android应用程序能够使用互联网进行通信&#xff0c;你需要在AndroidManifest.xml文件中添加网络权限声明。<uses-permission android:name"android.permission.INTERNET"/> 这个权限应该添加到 Android…

76基于matlab的免疫算法求解配送中心选址问题,根据配送地址确定最佳配送中心地址位置。

基于matlab的免疫算法求解配送中心选址问题&#xff0c;根据配送地址确定最佳配送中心地址位置。数据可更换自己的&#xff0c;程序已调通&#xff0c;可直接运行。 76matlab免疫算法配送中心选址 (xiaohongshu.com)

我又开始贩卖焦虑了,机器视觉兄弟们,打工这生意盘不活了?让人逃离北上广深,是毒鸡汤吗?

我想大多数人和我想的一样&#xff0c;不要质疑自己的出身&#xff0c;也不必用一生去改变出身而获得融入感&#xff0c;思想富足这是我们留给自己一生最珍贵的礼物。也许一线城市容不下肉身&#xff0c;二三线城市容不下灵魂。那我回到生我养我的十八线小县城&#xff0c;这不…

人力资源小程序

人力资源管理对于企业的运营至关重要&#xff0c;而如今随着科技的发展&#xff0c;制作一个人力资源小程序已经变得非常简单和便捷。在本文中&#xff0c;我们将为您介绍如何通过乔拓云网制作一个人力资源小程序&#xff0c;只需五个简单的步骤。 第一步&#xff1a;注册登录乔…

超详细~25考研规划~感恩现在努力的你!!!

25考研规划 俄语&#xff0c;翻译过来叫我爱你 考试时间 第一天 8.30-11.30政治——100分 2.00-5.00英语——100分 第二天 8.30-11.30数学——150分 2.00-5.00专业课——150分 1.什么是25考研 将在2024年12月参加考研&#xff0c;2025年本科毕业&#xff0c;9月读研究…

机器视觉系统中的工业镜头的参数

光学倍率 β 焦距 f F值&#xff08;光圈&#xff09;Fno. 数值孔径 NA 工作距离 WD 视场&#xff08;视场角&#xff0c;视野&#xff09; 景深DOF 分辨率、分辨力 MTF 畸变

Vue3+Vite实现工程化,事件绑定以及修饰符

我们可以使用v-on来监听DOM事件&#xff0c;并在事件触发时执行对应的Vue的Javascript代码。 用法&#xff1a;v-on:click "handler" 或简写为 click "handler"vue中的事件名原生事件名去掉 on 前缀 如:onClick --> clickhandler的值可以是方法事件…

支付宝沙箱支付

支付宝沙箱支付 支付宝沙箱&#xff08;Alipay Sandbox&#xff09;是支付宝提供的一个模拟环境&#xff0c;用于开发者在不影响真实交易的情况下进行支付宝相关功能的测试和调试。在软件开发中&#xff0c;沙箱环境通常指的是一个隔离的测试环境&#xff0c;可以模拟真实环境…

单张图像3D重建:原理与PyTorch实现

近年来&#xff0c;深度学习&#xff08;DL&#xff09;在解决图像分类、目标检测、语义分割等 2D 图像任务方面表现出了出色的能力。DL 也不例外&#xff0c;在将其应用于 3D 图形问题方面也取得了巨大进展。 在这篇文章中&#xff0c;我们将探讨最近将深度学习扩展到单图像 3…

开源与闭源:大模型发展的双重走向

目录 前言开源和闭源的优劣势比较开源的优势闭源的优势 开源和闭源对大模型技术发展的影响对技术发展的影响对数据共享的影响对业务拓展的影响 开源与闭源的商业模式比较开源的商业模式闭源的商业模式 处在大模型洪流中&#xff0c;向何处去&#xff1f;结语 前言 随着人工智能…