动态规划-53.最大子数组和-力扣(LeetCode)

一、题目解析

在给定顺序的数组中找出一段具有最大和的连续子数组,且大小最小为1.

二、算法原理

1.状态表示

我们可以意一一枚举出所有的子数组,但我们想要的是最大子数组,所以f[i]表示:以i位置为结尾,所有子数组的最大和

2.状态转移方程

f[i]当长度为1时,此时的子数组和为nums[i],当长度大于1时,此时的子数组和为[0,i-1]的子数组最大值加上nums[i],我们需要取二者中的最大值。

所以f[i]=max(nums[i],f[i-1]+nums[i]);

3.初始化

在计算f[i]中我们用到了f[i-1]当i处于0位置时,越界访问,所以我们可以直接初始化f[0],或者加一个虚拟格子用于初始化。

4.填表顺序

从左到右填表,保证所需值已计算

5.返回值

由于f[i]中存储的是到达i位置的最大子数组和,我们需要知道从[0,n-1] 区间内的最大值,所以返回值为f[i]中的最大值

思考与实践同等重要,在思考后可以去实现一下,链接:53. 最大子数组和 - 力扣(LeetCode)

三、代码示例

cpp 复制代码
class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int n = nums.size();
        vector<int> dp(n+1);
        for(int i = 1;i<=n;i++)
        {
            dp[i] = max(nums[i-1],dp[i-1]+nums[i-1]);
        }
        int MAX = INT_MIN;//数组中存在负数,所以在比大小时用int的最小值比较,也可以赋值f[1]从2到n开始比较
        for(int i = 1;i<=n;i++)
        {
            if(dp[i]>MAX) MAX = dp[i];
        }

        return MAX;
    }
};

看到最后,如果对您有所帮助请点赞、收藏和关注, 点点关注不迷路,我们下期再见!

相关推荐
胖咕噜的稞达鸭1 小时前
算法入门:专题攻克一---双指针(3)有效三角形的个数 查找总价格为目标值的两个商品(剑指offer题目)
算法
charlie1145141915 小时前
精读C++20设计模式:行为型设计模式:中介者模式
c++·学习·设计模式·c++20·中介者模式
楼田莉子5 小时前
Qt开发学习——QtCreator深度介绍/程序运行/开发规范/对象树
开发语言·前端·c++·qt·学习
逻辑留白陈5 小时前
Adaboost进阶:与主流集成算法对比+工业级案例+未来方向
算法
Learn Beyond Limits5 小时前
Mean Normalization|均值归一化
人工智能·神经网络·算法·机器学习·均值算法·ai·吴恩达
oioihoii5 小时前
超越 std::unique_ptr:探讨自定义删除器的真正力量
c++
天选之女wow6 小时前
【代码随想录算法训练营——Day28】贪心算法——134.加油站、135.分发糖果、860.柠檬水找零、406.根据身高重建队列
算法·leetcode·贪心算法
Gohldg6 小时前
C++算法·贪心例题讲解
c++·数学·算法·贪心算法
天若有情6736 小时前
C++空值初始化利器:empty.h使用指南
开发语言·c++
远远远远子6 小时前
类与对象 --1
开发语言·c++·算法