首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >动态规划 —— 子数组系列-环形子数组的最大和

动态规划 —— 子数组系列-环形子数组的最大和

作者头像
迷迭所归处
发布于 2024-11-19 09:21:01
发布于 2024-11-19 09:21:01
17100
代码可运行
举报
文章被收录于专栏:动态规划动态规划
运行总次数:0
代码可运行

1. 环形子数组的最大和

题目链接: 918. 环形子数组的最大和 - 力扣(LeetCode)

https://leetcode.cn/problems/maximum-sum-circular-subarray/description/


2. 题目解析


3. 算法原理

状态表示:以某一个位置为结尾或者以某一个位置为起点 f[i]表示:以i位置为结尾的所有子树中的最大和 g[i]表示:以i位置为结尾的所有子树中的最小和

2. 状态转移方程 f[i]分为两种情况:1. 长度为1 nums[i] 2. 长度大于1 nums[i] + f[i-1] f[i] = max(nums[i] , f[i-1] + nums[i]) g[i]分为两种情况: 1. 长度为1 nums[i] 2. 长度大于1 nums[i] + g[i-1] g[i] = min(nums[i] , g[i-1] + nums[i])

3. 初始化把dp表填满不越界,让后面的填表可以顺利进行 我们可以在左边加上一个虚拟节点,为了不影响最终结果,那么就可以把这个虚拟节点初始化为0 本题的下标映射关系:下标统一往后移动一位

4. 填表顺序 本题的填表顺序是:从左往右

5. 返回值 :题目要求 + 状态表示 本题的返回值是:1. 找到f表里的最大值,fmax 2.找到g表里的最小值,gmin, gmin在对比之前要先用sum - gmin再进行比较 在这里我们要考虑数组里全是负数的情况,比如为{-1,-2,-3},那么fmax的值就是-1,gmin的值就是三个数相加,sum - gmin的结果就为0,这样题目就不允许,所以我们要加上一个判断条件: 当sum和gmin相等的时候说明数组里面的值都是负数,那么就直接返回fmax,否则就返回两者相比之后的值


4. 代码

动态规划的固定四步骤:1. 创建一个dp表 2. 在填表之前初始化 3. 填表(填表方法:状态转移方程) 4. 确定返回值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
public:
    int maxSubarraySumCircular(vector<int>& nums) {
        int n=nums.size();
        vector<int>f(n+1),g(n+1);
        

    int fmax=INT_MIN,gmin=INT_MAX,sum=0;

        for(int i=1;i<=n;i++)
        {
            int x=nums[i-1];//加上一个虚拟节点下标-1
            f[i]=max(x,f[i-1]+x);
            fmax=max(f[i],fmax);
            
            g[i]=min(x,g[i-1]+x);
            gmin=min(g[i],gmin);
            sum+=x;
        }
            return sum==gmin?fmax:max(fmax,sum-gmin);
    }
};

未完待续~

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-11-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【OJ】动归练习五之子组串
一、题目解析: 求子数组最大和,可能会有所有元素和和子数组所有的和比较,然后取最大的一个。
zxctscl
2024/04/02
1090
【OJ】动归练习五之子组串
【动态规划】忽遇狂风起,闲心不自由. - 子数组问题
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
用户11369350
2024/12/31
1000
【动态规划】忽遇狂风起,闲心不自由. - 子数组问题
【LeetCode】动态规划 刷题训练(七)
可以只取3,或者取3和-2 由于数组是环形的,所以在3和-2的基础上再取1 和-2 通过比较,取3是最大和
lovevivi
2023/10/17
1590
【LeetCode】动态规划 刷题训练(七)
动态规划 —— 子数组系列-乘积最大子数组
https://leetcode.cn/problems/maximum-product-subarray/description/
迷迭所归处
2024/11/19
1390
动态规划 —— 子数组系列-乘积最大子数组
动态规划之环形数组最大子数组问题
对于第二种类型,我们知道,数组的总和是固定的,如果我们可以求出以i为结尾的最小数组和,那不就相当于得到了以i为结尾的最大子数组和了嘛。
破晓的历程
2024/06/24
1030
动态规划之环形数组最大子数组问题
动态规划 —— 子数组系列-最大子数组和
https://leetcode.cn/problems/maximum-subarray/description/
迷迭所归处
2024/11/19
2610
动态规划 —— 子数组系列-最大子数组和
【算法专题】动态规划之子数组和子串系列
题目:给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
YoungMLet
2024/03/01
4000
DP:子数组问题
介绍动态规划(DP)在解决子数组问题上的重要性,以及本文的目的——通过具体问题的分析和代码示例,帮助读者理解如何用DP解决子数组问题。
用户11305458
2024/10/09
1750
DP:子数组问题
动态规划(七)——子数组系列(求和问题)
题目要求十分简单,想让我们求解数组最大的连续子数组的和,其中数组元素有正数也有负数,我们结合动态规划思想来解决这个问题~
用户11352420
2025/05/23
1260
动态规划(七)——子数组系列(求和问题)
动态规划 —— 子数组系列-乘积为正数的最长子数组长度
https://leetcode.cn/problems/maximum-length-of-subarray-with-positive-product/description/
迷迭所归处
2024/11/19
870
动态规划 —— 子数组系列-乘积为正数的最长子数组长度
【动态规划】子数组系列(上)
i 位置为结尾的子数组又可以分为长度为 1 的和大于 1 的,长度为 1 就是 nums[i] ,长度不为 1 就是 dp[i - 1] + nums[i],最后取这两个的最大值即可
2的n次方
2024/10/15
1510
【动态规划】子数组系列(上)
DP:子数组模型
小陈在拼命
2024/04/12
1500
DP:子数组模型
动态规划子数组系列一>环形子数组的最大和
用户11305962
2024/11/21
920
动态规划子数组系列一>环形子数组的最大和
【算法刷题指南】动态规划之子数组系列
南桥
2024/11/03
960
动态规划(八)——子数组系列(求积问题)
这一篇博客我们继续来领略动态规划算法的魅力~准备好了吗~我们发车去探索动态规划的奥秘啦~🚗🚗🚗🚗🚗🚗
用户11352420
2025/05/25
670
动态规划(八)——子数组系列(求积问题)
【动态规划算法练习】day6
53. 最大子数组和 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组是数组中的一个连续部分。
摘星
2023/10/15
1840
【动态规划算法练习】day6
动态规划 —— 子数组系列-最长湍流子数组
https://leetcode.cn/problems/longest-turbulent-subarray/description/
迷迭所归处
2024/11/19
1500
动态规划 —— 子数组系列-最长湍流子数组
每周算法:斐波那契数列模型+路径问题+简单多状态dp+子数组系列
T0 = 0, T1 = 1, T2 = 1, 且在 n >= 0 的条件下 Tn+3 = Tn + Tn+1 + Tn+2
啊QQQQQ
2024/11/19
1130
每周算法:斐波那契数列模型+路径问题+简单多状态dp+子数组系列
动态规划 —— 子数组系列-等差数列划分
https://leetcode.cn/problems/arithmetic-slices/description/
迷迭所归处
2024/11/19
990
动态规划 —— 子数组系列-等差数列划分
【动态规划】子数组系列(下)
状态转移方程:由于至少需要三个元素才符合题目中等差数列的要求,所以需要判断 i - 2,i - 1,i 三个元素,当这三个元素符合等差数列时,那么以 i - 1 为结尾的等差数列再加上 i 也是等差数列,等差数列的个数就 + 1,如果说这三个元素不符合等差数列,那么以 i 为结尾的等差数列个数就是 0
2的n次方
2024/10/15
1310
【动态规划】子数组系列(下)
推荐阅读
相关推荐
【OJ】动归练习五之子组串
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验