深处的记忆——最大子数组和

简介: 深处的记忆——最大子数组和

题目描述

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

子数组

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


示例 1:

输入:nums = [-2,1,-3,4,-1,2,1,-5,4]

输出:6

解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。


思路:

题目意思很简单,最暴力的两层遍历然后取最大的那个值,能出结果,但肯定会超时。

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int f=-1e9;
        for(int i=0;i<nums.size();i++){
            int res=0;
            for(int j=i;j<nums.size();j++){
                res+=nums[j];
                f=max(f,res);
            }
        }
        return f;
    }
};

如何不超时呢,题目要求我们是不需要给出子序列的,只需要最大值即可。那么其实就到了动态规划擅长的地方了,也不需要怕动态规划,这个题还是很简单,各位读者往下看。

      很简单的道理:和负数相加总和会变小,和正数相加总和会变大


  • 定义状态:设定一个状态数组 dp,其中 dp[i] 表示以第 i 个元素结尾的最大子数组和。
  • 状态转移方程:dp[i] = max(dp[i-1] + nums[i], nums[i]),即要么将当前元素加入到之前的子数组中,要么以当前元素开始一个新的子数组。
  • 最终结果:遍历 dp 数组,找到其中的最大值,即为最大子数组和。

两种版本的代码:

class Solution {
public:
    int f[100005]; // 定义一个数组 f,用于存储以当前元素结尾的最大子数组和
    int maxSubArray(vector<int>& nums) {
        f[1] = nums[0]; // 初始化 f[1] 为第一个元素的值
        // 遍历数组 nums,计算以当前元素结尾的最大子数组和
        for(int i = 2; i <= nums.size(); i++) {
            if(f[i - 1] >= 0)
                f[i] = f[i - 1] + nums[i - 1]; // 若前一个元素结尾的子数组和大于等于 0,则将当前元素加入子数组中
            else
                f[i] = nums[i - 1]; // 否则,以当前元素开始一个新的子数组
        }
        int res = f[1]; // 初始化最大子数组和为数组第一个元素的值
        // 找到 f 数组中的最大值,即为最大子数组和
        for(int i = 2; i <= nums.size(); i++)
            res = max(res, f[i]);
        return res; // 返回最大子数组和
    }
};

简洁版本:

class Solution {
public:  
    int maxSubArray(vector<int>& nums) {
        int res = nums[0]; // 初始化最大子数组和为第一个元素的值
        for(int i = 1; i < nums.size(); i++) {
            if(nums[i - 1] >= 0) // 如果前一个元素结尾的子数组和大于等于 0
                nums[i] += nums[i - 1]; // 将当前元素加入到前一个子数组中
            if(nums[i] > res) // 如果当前子数组和大于最大值
                res = nums[i]; // 更新最大值为当前子数组和
        }
        return res; // 返回最大子数组和
    }
};
相关文章
|
4月前
|
人工智能 程序员 定位技术
老程序员分享:NOIP2016天天爱跑步(树上差分)
老程序员分享:NOIP2016天天爱跑步(树上差分)
19 0
|
5月前
【编程题-错题集】kotori和气球(组合数学)
【编程题-错题集】kotori和气球(组合数学)
|
算法 JavaScript 前端开发
日拱算法:解两道“杨辉三角”题
什么是“杨辉三角”,想必大家并不陌生~~ 在「杨辉三角」中,每个数是它左上方和右上方的数的和。
|
算法
【算法竞赛进阶指南】关押罪犯(二分+染色法判断二分图)
【算法竞赛进阶指南】关押罪犯(二分+染色法判断二分图)
85 0
再学一道算法题: 最大子列和问题
再学一道算法题: 最大子列和问题
再学一道算法题: 最大子列和问题
|
机器学习/深度学习 定位技术
【刷穿 LeetCode】789. 逃脱阻碍者 : 详解为何能转化为曼哈顿距离求解
【刷穿 LeetCode】789. 逃脱阻碍者 : 详解为何能转化为曼哈顿距离求解
|
算法 Java
十道简单算法题(一)
最近在回顾以前使用C写过的数据结构和算法的东西,发现自己的算法和数据结构是真的薄弱,现在用Java改写一下,重温一下。
146 0
十道简单算法题(一)
|
存储 算法 Java
十道简单算法题(二)
最近在回顾以前使用C写过的数据结构和算法的东西,发现自己的算法和数据结构是真的薄弱,现在用Java改写一下,重温一下。
438 0
十道简单算法题(二)