文章目录

  • 1. 题目
  • 2. 解题

1. 题目

给定一个由整数数组 A 表示的环形数组 C,求 C 的非空子数组最大可能和。

在此处,环形数组意味着数组的末端将会与开头相连呈环状。
(形式上,当0 <= i < A.length 时 C[i] = A[i],且当 i >= 0 时 C[i+A.length] = C[i])

此外,子数组最多只能包含固定缓冲区 A 中的每个元素一次
(形式上,对于子数组 C[i], C[i+1], …, C[j],不存在 i <= k1, k2 <= j 其中 k1 % A.length = k2 % A.length)

示例 1:
输入:[1,-2,3,-2]
输出:3
解释:从子数组 [3] 得到最大和 3示例 2:
输入:[5,-3,5]
输出:10
解释:从子数组 [5,5] 得到最大和 5 + 5 = 10示例 3:
输入:[3,-1,2,-1]
输出:4
解释:从子数组 [2,-1,3] 得到最大和 2 + (-1) + 3 = 4示例 4:
输入:[3,-2,2,-3]
输出:3
解释:从子数组 [3] 和 [3,-2,2] 都可以得到最大和 3示例 5:
输入:[-2,-3,-1]
输出:-1
解释:从子数组 [-1] 得到最大和 -1提示:
-30000 <= A[i] <= 30000
1 <= A.length <= 30000

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-sum-circular-subarray
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

  • 先将数组拼接一次,并计算前缀和
  • 以每个位置为结束的子数组的前缀和,需要减去前面 n 个位置里的最小的前缀和,就是这段的最大值
  • 使用单调递增队列来维护前面 n 个位置以内的前缀和的递增,每次减去队首的前缀和(最小的)
class Solution {public:int maxSubarraySumCircular(vector<int>& A) {int n = A.size(), maxsum = INT_MIN;vector<int> arr(2*n);for(int i = 0; i < 2*n; ++i){arr[i] = A[i%n];//原数组复制为 A+Aarr[i] += i>0 ? arr[i-1] : 0;//前缀和}//下面求最长长度n的子数组最大和deque<int> q;//存下标,队列内前缀和的值保持单调递增for(int i = 0; i < 2*n; ++i){while(!q.empty() && i-q.front() > n)//距离超了的,删除(每个元素只能出现1次,长度最大为n)q.pop_front();maxsum = max(maxsum, arr[i]-(q.empty() ? 0 : arr[q.front()]));while(!q.empty() && arr[q.back()] > arr[i])q.pop_back();//保持队内单调递增q.push_back(i);}return maxsum;}
};

144 ms 44 MB C++


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!

LeetCode 918. 环形子数组的最大和(前缀和+单调队列)相关推荐

  1. LeetCode动态规划 环形子数组的最大和

    给定一个由整数数组 A 表示的环形数组 C,求 C 的非空子数组的最大可能和. 此外,子数组最多只能包含固定缓冲区 A 中的每个元素一次. 思路 本道题需要分类成两种情况,题目答案为以下两种情况的较大 ...

  2. 动态规划——环形子数组的最大和(Leetcode 918)

    题目选自Leetcode 918. 环形子数组的最大和 非常难懂的题目,但是本质其实就是求最大子序列和,思路 题目描述: 解题思路: 两边的和怎么求呢 ,是不是就是用全部的和减去中间那一块的,中间那一 ...

  3. 【LeetCode】剑指 Offer 42. 连续子数组的最大和

    [LeetCode]剑指 Offer 42. 连续子数组的最大和 文章目录 [LeetCode]剑指 Offer 42. 连续子数组的最大和 一.动态规划 一.动态规划 状态定义 设动态规划列表 dp ...

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

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

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

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

  6. LeetCode -- 剑指 Offer 42. 连续子数组的最大和

    剑指 Offer 42. 连续子数组的最大和 线性 DP 题. 针对于数组nums[i] 而言,以它为结尾的子数组分两种情况:(题目限制:必须是连续数组) num[i] 自身作为独立子数组:f[i] ...

  7. 【动态规划】记录每步选择:牛客网:连续子数组的最大和(二)

    输入一个长度为n的整型数组array,数组中的一个或连续多个整数组成一个子数组,找到一个具有最大和的连续子数组. 1.子数组是连续的,比如[1,3,5,7,9]的子数组有[1,3],[3,5,7]等等 ...

  8. 面试题31.连续子数组的最大和

    题目:输入一个整型数组,数组里有正数也有负数.数组中一个或者连续多个整数组成一个子数组. 求所有子数组的和的最大值.要求时间复杂度O(n) 本题可以把所有子数组全部找出来再求其和的最大值便可以得出,但 ...

  9. 算法 求子数组的最大和 C

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! //** ...

最新文章

  1. 面向过程方法学开发软件的特点
  2. python基础知识第四篇(元组)
  3. ImportError: No module named openid
  4. 逻辑综合——概述与基本概念
  5. php 实现树状组织图插件,使用jstree插件实现树形结构
  6. nsga2代码解读python_代码资料
  7. 微信公众平台开发资源集锦
  8. WebClient Exceeded limit on max bytes to buffer : 262144 异常解决
  9. 基于SSD目标检测模型的人脸口罩识别
  10. selenium鼠标操作
  11. dvi接口少4针_DVI接口针脚数量,详细图文资料介绍
  12. 纯css实现tooltip文字浮框
  13. 软件项目管理案例教程-韩万江-期末复习
  14. C++中BitBlt的使用方法详解
  15. redis的nodejs客户端ioredis初识
  16. 【图像加密】基于混沌系统的图像加密解密matlab源码含GUI
  17. MATLAB 画五星红旗
  18. 教师学计算机内容包括哪些,中学计算机教师类论文参考文献 中学计算机教师核心期刊参考文献有哪些...
  19. 微信开发者导入微信小程序项目
  20. 偷偷告诉你四款好玩实用的电脑软件让你嗨翻天

热门文章

  1. 机器学习之 sklearn.preprocessing 模块
  2. 基于matlab的大米,大米颗数计算MATLAB软件
  3. Node.js中事件的循环
  4. 【Mysql】数据库主从搭建-基于docker
  5. selector多路复用_多路复用器Selector
  6. 立体匹配十大概念综述---立体匹配算法介绍
  7. 嵌入式面试中常见的问答题(线程进程、TCP等)
  8. 成都电讯学院研发的计算机,成都电讯工程学院
  9. 一些Base64编码/解码及数据压缩/解压方面的知识
  10. 使用loadrunner编写webservice接口请求