给定一个由整数数组 A 表示的环形数组 C,求 C 的非空子数组的最大可能和。
此外,子数组最多只能包含固定缓冲区 A 中的每个元素一次。

思路
本道题需要分类成两种情况,题目答案为以下两种情况的较大值。
1.最大子区间在序列的中间
这种情况是常规的最长子序列做法。
状态转移方程
dp[i] = max(nums[i], dp[i-1] + nums[i])
边界条件
dp[0] = nums[0]
2.最大子区间被分割成两部分(即头尾各一部分)
处理分段区间比较麻烦,当遇到最大最小问题的时候,可以想办法将其反面转化。可以先求出最小子区间和,然后用总区间和减去最小子区间和即可。
状态转移方程
dp[i] = min(nums[i], dp[i-1] + nums[i])
边界条件
dp[0] = nums[0]

坑点
一般遇到此类的题,都需要特判一下边界条件。本题需要注意当总区间全为负数时,应输出区间中最大的一个负数,而不是0。
产生边界的原因:
在第二中情况下求最小子区间时,若总区间全为负数,求出最小区间和即为总区间和。而本题反面转化是基于最大子区间和最小区间是对立的,即不能有重合。如此,这种情况的最大子区间长度是0,不符合题意至少为1的条件。

代码

class Solution {public:int maxSubarraySumCircular(vector<int>& nums) {int dp[30005] = {0};int len = nums.size();dp[0] = nums[0];int maxn = nums[0];for(int i = 1; i < len; i++){dp[i] = max(nums[i], dp[i-1] + nums[i]);if(dp[i] > maxn)maxn = dp[i];}bool flag = true;int dp2[30005] = {0};dp2[0] = nums[0];int minn = nums[0];int sum = nums[0];if(nums[0] > 0)flag = false;for(int i = 1; i < len; i++){if(nums[i] > 0)flag = false;sum += nums[i];dp2[i] = min(nums[i], dp2[i-1] + nums[i]);if(dp2[i] < minn)minn = dp2[i];}if(flag == true)return maxn;if(sum - minn > maxn)maxn = sum - minn;return maxn;}
};

LeetCode动态规划 环形子数组的最大和相关推荐

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

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

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

    文章目录 1. 题目 2. 解题 1. 题目 给定一个由整数数组 A 表示的环形数组 C,求 C 的非空子数组的最大可能和. 在此处,环形数组意味着数组的末端将会与开头相连呈环状. (形式上,当0 & ...

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

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

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

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

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

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

  6. 连续子数组的最大和(基于动态规划)

    题目 输入一个整型数组,数组里有正数也有负数.数组中一个或连续的多个整数组成一个子数组.求所有子数组的和的最大值.要求时间复杂度为O(n).例如输入的数组为{1,-2,3,10,-4,7,2,-5}, ...

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

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

  8. 【剑指 offer】(31)—— 连续子数组的最大和(动态规划)

    题目:输入一个整型数组,数组里有正数也有负数.数组中一个或连续的多个整数组成一个子数组.求所有子数组的和的最大值.要求时间复杂度为 O(n)O(n). 例如,输入的数组为 {1, -2, 3, 10, ...

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

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

最新文章

  1. python property内建函数的介绍
  2. Unity5x编辑器的视图二
  3. df.where(dfmask, targetValue)展示
  4. Java第一次读文件慢_Java 关于文件读取速度问题,求助,谢谢啦
  5. 提取图片名称 c 语言,【图片】给词法元素分析提取的程序跪了【c语言吧】_百度贴吧...
  6. 应用在tomcat下的四种部署方式(原创)
  7. 晚上:上课笔记,听完自己独立完成
  8. SQL Server系统视图/表/功能。 现实生活中的常见问题和解决方案
  9. python做鼠标自动移动_Python实现鼠标自动在屏幕上随机移动功能
  10. PAT乙级1055 集体照
  11. 一个TCP FIN_WAIT2状态细节引发的感慨
  12. 大数据HBase(十五):HBase的Bulk Load批量加载操作
  13. 2019 年第 30 周 DApp 影响力排行榜 | TokenInsight
  14. 将数组分成两部分,使得 |sum1 - sum2| 最小. LeetCode - 1049
  15. 如何在金仓数据库KingbaseES中使用pg_get_function_arg_default函数
  16. 依概率不放回随机抽样算法
  17. web前端期末大作业:基于HTML+CSS+JavaScript奥迪企业bootstrap响应式网站
  18. 阿里云视频直播视频存储回调功能的处理方法
  19. Java集合--阻塞队列(ArrayBlockingQueue)
  20. 03 CoCos Creator 偏好设置中ndk配置

热门文章

  1. (七)python3 只需3小时带你轻松入门——List与dict
  2. 你绝对干过的15件傻事儿
  3. 深度学习会不会被取代?深度学习必看发展史
  4. 用一个小球揭开地球的面纱,探索地球运转的秘密!
  5. 把握人工智能命脉的有效方法
  6. layui 如何去dom_javascript 怎么去引用layui里面的方法
  7. php如果字符串有1 3 5,PHP常用字符串函数小结
  8. 点歌软件测试自学,实际歌唱对比测试
  9. linux基础 linhaifeng,Linux基础之命令练习Day2(示例代码)
  10. cass小插件集合_插件|如何精准提取CASS方格网高程点?