题目描述

给定数组

由正整数组成,找到三个互不重叠的子数组的最大和。 每个子数组的长度为
,我们要使这
个项的和最大化。 返回每个区间起始索引的列表(索引从 0 开始)。如果有多个结果,返回字典序最小的一个。

示例1

输入:
[1,2,1,2,6,7,5,1], 2
输出:
[0, 3, 5]
解释:
子数组 [1, 2], [2, 6], [7, 5] 对应的起始索引为 [0, 3, 5]。
我们也可以取 [2, 1], 但是结果 [1, 3, 5] 在字典序上更大。

提示

  • 的范围在[1, 20000]之间。
  • 的范围在[1, 65535]之间。
  • 的范围在 [1, floor(nums.legth / 3)]之间。

题解

首先看数据范围,这题不能使用暴力,暴力时间复杂度是

,一定会超时,所以考虑使用动态规划求解。

下面考虑一般情况,也就是求解划分成

个不重叠数组的最大和。

假设到第

个元素为止,一共已经产生了
个不重叠数组,那么令
表示这
个不重叠数组的最大和。

然后就要寻找状态转移方程。对于第

个元素,分为两种情况,可取可不取。

如果取,那就说明

是第
个子数组的最后一个元素,那么转移方程为:

也就是说,从

,这
个元素构成了第
个子数组,那我们只需要求到第
个元素为止,产生
个不重叠数组的最大和即可。

如果不取,那问题就变成了求到第

个元素为止,产生
个不重叠数组的最大和,那么转移方程为:

当然这题还需要你还原出最大和的情况下,所有子数组的起始元素下标,所以需要另外用一个数组保存一下每一步的最优下标。

同样,假设到第

个元素为止,一共已经产生了
个不重叠数组,用
表示第
个子数组的末尾元素下标。

那么按照上面的推断,如果取第

个元素,那么
;否则的话

最后就是根据

数组还原答案了。

首先最后一个子数组的末尾元素下标一定是

,那么它的起始元素下标就是
,然后前一个子数组末尾元素下标就是
,依次下去,直到第一个子数组被求解完毕。

代码

class Solution {public:vector<int> maxSumOfThreeSubarrays(vector<int>& nums, int k) {int len = nums.size(), N = 3;int sum[len], s = 0;for (int i = 0; i < k; ++i) {s += nums[i];sum[i] = 0;}sum[k-1] = s;for (int i = k; i < len; ++i) {s += nums[i] - nums[i - k];sum[i] = s;}int dp[len][N+1], path[len][N+1];memset(dp, 0, sizeof dp);dp[k-1][1] = sum[k-1];path[k-1][1] = k - 1;for (int i = k; i < len; ++i) {for (int j = 1; j <= N; ++j) {dp[i][j] = dp[i-1][j];path[i][j] = path[i-1][j];if (dp[i][j] < dp[i-k][j-1] + sum[i]) {dp[i][j] = dp[i-k][j-1] + sum[i];path[i][j] = i;}}}vector<int> res;int idx = path[len-1][N];res.push_back(idx - k + 1);for (int i = N - 1; i > 0; --i) {idx = path[idx-k][i];res.push_back(idx - k + 1);}reverse(res.begin(), res.end());return res;}
};

后记

可以看到,时间和空间还有提升的余地。想到的可能优化方法是类似于0-1背包那样,去掉动态规划数组的第二个维度,来优化空间复杂度。

但是这是有些问题的,暂时并没有想到不增加时间复杂度下减少空间开销的方法,欢迎大家提出自己的想法。

数组最大可以开多大_每日算法系列【LeetCode 689】三个无重叠子数组的最大和相关推荐

  1. 【LeetCode每日一题】【2021/12/8】689. 三个无重叠子数组的最大和

    文章目录 689. 三个无重叠子数组的最大和 方法1:滑动窗口 689. 三个无重叠子数组的最大和 LeetCode: 689. 三个无重叠子数组的最大和 困难\color{#EF4743}{困难}困 ...

  2. 1031. 两个非重叠子数组的最大和-构造子数组和数组遍历数组

    1031. 两个非重叠子数组的最大和-构造子数组和数组遍历数组 给出非负整数数组 A ,返回两个非重叠(连续)子数组中元素的最大和,子数组的长度分别为 L 和 M.(这里需要澄清的是,长为 L 的子数 ...

  3. 重复次数最多的 子串_每日算法系列【LeetCode 424】替换后的最长重复字符

    题目描述 给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次.在执行上述操作后,找到包含重复字母的最长子串的长度. 示例1 输入: s = &quo ...

  4. Leetcode 剑指 Offer 42. 连续子数组的最大和 (每日一题 20211014)

    输入一个整型数组,数组中的一个或连续多个整数组成一个子数组.求所有子数组的和的最大值.要求时间复杂度为O(n).示例1:输入: nums = [-2,1,-3,4,-1,2,1,-5,4] 输出: 6 ...

  5. 如何表示数组所有数都不等于一个数_每日算法系列【LeetCode 523】连续的子数组和...

    题目描述 给定一个包含非负数的数组和一个目标整数 k,编写一个函数来判断该数组是否含有连续的子数组,其大小至少为 2,总和为 k 的倍数,即总和为 n*k,其中 n 也是一个整数. 示例1 输入: [ ...

  6. 如何表示数组所有数都不等于一个数_每日算法系列【LeetCode 330】按要求补齐数组...

    题目描述 给定一个已排序的正整数数组 nums ,和一个正整数 n .从 [1, n] 区间内选取任意个数字补充到 nums 中,使得 [1, n] 区间内的任何数字都可以用 nums 中某几个数字的 ...

  7. 求栈中元素个数算法_每日算法系列【LeetCode 315】计算右侧小于当前元素的个数...

    题目描述 给定一个整数数组 nums ,按要求返回一个新数组 counts .数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧小于 nums[i] 的元素的数量. 示例 ...

  8. 序列复杂度怎么看_每日算法系列【LeetCode 376】摆动序列

    题目描述 如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列.第一个差(如果存在的话)可能是正数或负数.少于两个元素的序列也是摆动序列. 例如, [1,7,4,9,2,5] 是一个 ...

  9. 找出最具竞争力的子序列_每日算法系列【LeetCode 376】摆动序列

    题目描述 如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列.第一个差(如果存在的话)可能是正数或负数.少于两个元素的序列也是摆动序列. 例如, [1,7,4,9,2,5] 是一个 ...

最新文章

  1. document 获得元素节点,属性节点,文本节点。
  2. cocos2d-x CCScrollView和CCTableView的使用(转载)
  3. [备忘]macOS和Windows下很赞的软件
  4. js基于lodash实现前端防抖与节流
  5. python函数理解,python对函数的理解
  6. 树莓派3b安装ubuntu mate(在有显示器前提下看)
  7. 幼儿学数数的c语言程序,【资源学习】c语言程序代码,登录幼儿园200个小朋友的数据...
  8. js元素事件的绑定与解绑,绑定事件的区别
  9. 装机主板抽象工厂模式(Abstract Factory)
  10. 【转】Git连接oschina管理代码版本
  11. JAVA-JVM调优标志
  12. Pico Neo3 4VR游戏下载地址及十大好玩游戏推荐
  13. Stale branches 设置_交通规划软件之TransCAD如何设置立交模型的步骤
  14. 阳明先生固天纵英才矣《王阳明全集》作者: 王守仁
  15. 所学所感,贵在坚持。
  16. “第二期政府CIO论坛”顺利举行
  17. 自定义navigationBar字体大小颜色背景色
  18. java定时执行(设置每天几点执行一次)
  19. 使用python生成随机中奖姓名和电话号码并存入excel
  20. 移动端接口文档管理工具apizza安装

热门文章

  1. 一步一步将自己的代码转换为观察者模式
  2. Android 图书总汇
  3. oracle表数据误删恢复
  4. 【STM32】PWM 输出实验代码详解
  5. MT6573驱动开发日志之touchpanel .
  6. 如何开发一个能拯救银河系的充电器
  7. 【PC工具】在线格式转换工具,视频格式转换,视频转gif工具
  8. IPv6环境下路由器支持域名登录
  9. 【蚁群路径规划】基于MATLAB的蚁群算法的二维路径规划
  10. 华为与各国政府签订无间谍无后门协议