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

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

题目描述

给你一个整数数组 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; // 返回最大子数组和
    }
};
相关文章
|
人工智能 监控 搜索推荐
银行CRM系统全解析:如何优化客户服务体验
银行CRM系统聚焦客户,提供个性化服务,包括客户信息管理、分析、营销和服务管理,旨在提升服务、扩大客户群和降低成本。未来系统将侧重数据挖掘和智能应用,结合新技术,驱动银行业的数字化转型。CRM系统对提升银行竞争力和适应市场变化至关重要,并将持续进化以支持行业创新。
524 0
|
XML Java API
使用WebService接口进行数据通信
使用WebService接口进行数据通信
|
存储 弹性计算 Ubuntu
阿里云云服务器实例使用教学
云服务器免费试用 阿里云云服务器网址:https://free.aliyun.com/?crowd=personal 详细步骤 访问阿里云免费试用。单击页面右上方的登录/注册按钮,并根据页面提示完成账号登录(已有阿里云账号)、账号注册(尚无阿里云账号)或实名认证(根据试用产品要求完成个人实名认证或企业实名认证)。 成功登录后,可试用人群选择个人认证,产品类别选择计算 > 云服务器 ECS,在试用卡片上单击立即试用。 在配置ECS实例信息面板,完成参数信息配置。本试用教程主要配置参数如表所示,其他参数可保持默认值。实际操作时,建议根据您的实际业务体量和需求选择。 参数 示例 操作系统 CentO
783 1
|
存储 缓存 NoSQL
高并发项目部署以及优化手段
高并发项目部署以及优化手段
1254 0
|
机器学习/深度学习 消息中间件 SQL
机器学习算法岗求职经验贴(下)
机器学习算法岗求职经验贴(下)
|
iOS开发 MacOS Python
完美解决 Python library not found: libpython3.10m.dylib, Python3, .Python, libpython3....
完美解决 Python library not found: libpython3.10m.dylib, Python3, .Python, libpython3....
385 0
|
机器学习/深度学习 算法 网络安全
【OpenVI—论文解读系列】ICML long talk | 开源半监督学习框架Dash
论文链接:Dash: Semi-Supervised Learningwith DynamicThreolding 本文介绍机器学习顶级国际会议 ICML 2021 接收的 long talk (top 3.02%) 论文 “Dash: Semi-Supervised Learning with Dynamic Thresholding”。
546 5
|
计算机视觉
基于opencv的Qt开发项目
基于opencv的Qt开发项目
|
SQL 关系型数据库 MySQL
28个案例问题分析---02---sql优化--mysql执行顺序、explain关键字解析
28个案例问题分析---02---sql优化--mysql执行顺序、explain关键字解析
353 0