LeetCode刷题--- 最大子数组和

发布时间:2024年01月23日

个人主页:元清加油_【C++】,【C语言】,【数据结构与算法】-CSDN博客

个人专栏

力扣递归算法题

?http://t.csdnimg.cn/yUl2I

【C++】? ??

??????http://t.csdnimg.cn/6AbpV

数据结构与算法

????http://t.csdnimg.cn/hKh2l


前言:这个专栏主要讲述动态规划算法,所以下面题目主要也是这些算法做的 ?

我讲述题目会把讲解部分分为3个部分:
1、题目解析

2、算法原理思路讲解

3、代码实现


最大子数组和

题目链接:最大子数组和

题目

给你一个整数数组?nums?,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

子数组?是数组中的一个连续部分。

示例 1:

输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组?[4,-1,2,1] 的和最大,为?6 。

示例 2:

输入:nums = [1]
输出:1

示例 3:

输入:nums = [5,4,-1,7,8]
输出:23

提示:

  • 1 <= nums.length <= 105
  • -104 <= nums[i] <= 104

解法

算法原理讲解

我们这题使用动态规划,我们做这类题目可以分为以下五个步骤

  1. 状态显示
  2. 状态转移方程
  3. 初始化(防止填表时不越界)
  4. 填表顺序
  5. 返回值

  • 状态显示
dp[i] 表示: 以 i? 位置元素为结尾的「所有子数组」中和的最大和。
  • 状态转移方程
dp[i] 的所有可能可以分为以下两种:
  1. 子数组的长度为 1 :此时 dp[i] = nums[i]
  2. 子数组的长度大于 1 :此时 dp[i] 应该等于 以 i - 1 做结尾的「所有?数组」中和的最?值再加上 nums[i] ,也就是 dp[i - 1] + nums[i]
由于我们要的是「最?值」,因此应该是两种情况下的最?值,因此可得转移方程: dp[i] = max(nums[i], dp[i - 1] + nums[i]) 。
  • 初始化(防止填表时不越界)
在本题中,最前?加上?个格?,并且让 dp[0] = 0 即可。
  • 填表顺序
根据「状态转移?程」易得,填表顺序为「从左往右」。
  • 返回值
状态表示为「以 i 为结尾的所有?数组」的最?值,但是最大子数组和的结尾我们是不确定的。 因此我们需要返回整个 dp 表中的最?值。

代码实现

class Solution {
public:
    int maxSubArray(vector<int>& nums) 
    {
        int n = nums.size();

        int ret = INT_MIN;
        vector<int> dp(n+1);
        dp[0] = 0;

        for(int i = 1; i <= n; i++)
        {
            dp[i] = max(nums[i-1], dp[i-1] + nums[i-1]);
            ret = max(ret, dp[i]);
        }

        return ret;
    }
};

文章来源:https://blog.csdn.net/weixin_74268082/article/details/135766054
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。