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

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

题目描述

给你一个整数数组 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; // 返回最大子数组和
    }
};
相关文章
|
数据可视化 大数据 数据挖掘
Apache Superset 1.2.0教程 (一)—— 安装(Windows版)
Apache Superset 是一款由 Airbnb 开源的“现代化的企业级 BI(商业智能) Web 应用程序”,其通过创建和分享 dashboard,为数据分析提供了轻量级的数据查询和可视化方案。 近日推出了全新的 1.2.0版本,本教程也就从头开始讲解Apache Superset的使用。
2643 0
Apache Superset 1.2.0教程 (一)—— 安装(Windows版)
|
微服务 数据库 持续交付
带你读《微服务架构设计模式》之一:逃离单体地狱
本书中,微服务架构的先驱、Java 开发者社区的意见领袖 Chris Richardson 收集、分类并解释了 44 个架构设计模式,这些模式用来解决诸如服务拆分、事务管理、查询和跨服务通信等难题。本书不仅仅是一个模式目录,还提供了经验驱动的建议,以帮助你设计、实现、测试和部署基于微服务的应用程序。
10821 1
|
人工智能 监控 搜索推荐
银行CRM系统全解析:如何优化客户服务体验
银行CRM系统聚焦客户,提供个性化服务,包括客户信息管理、分析、营销和服务管理,旨在提升服务、扩大客户群和降低成本。未来系统将侧重数据挖掘和智能应用,结合新技术,驱动银行业的数字化转型。CRM系统对提升银行竞争力和适应市场变化至关重要,并将持续进化以支持行业创新。
426 0
|
XML Java API
使用WebService接口进行数据通信
使用WebService接口进行数据通信
|
存储 运维 Dubbo
HSF:阿里RPC框架
HSF:阿里RPC框架
3520 0
|
Java Android开发
【dbeaver】IDEA 运行 dbeaver源码
【dbeaver】IDEA 运行 dbeaver源码
1398 1
|
缓存 应用服务中间件 nginx
基于Docker搭建ELK(Elasticsearch、Logstash、Kibana)
ELK是一套强大的开源工具组合,可以帮助我们采集、存储、分析和可视化大量的日志数据,本文通过简明清晰的步骤指导,帮助读者快速搭建起基于Docker的ELK日志分析平台,为日志数据的收集、存储、分析和可视化提供了一种高效可靠的解决方案。
|
存储 弹性计算 Ubuntu
阿里云云服务器实例使用教学
云服务器免费试用 阿里云云服务器网址:https://free.aliyun.com/?crowd=personal 详细步骤 访问阿里云免费试用。单击页面右上方的登录/注册按钮,并根据页面提示完成账号登录(已有阿里云账号)、账号注册(尚无阿里云账号)或实名认证(根据试用产品要求完成个人实名认证或企业实名认证)。 成功登录后,可试用人群选择个人认证,产品类别选择计算 > 云服务器 ECS,在试用卡片上单击立即试用。 在配置ECS实例信息面板,完成参数信息配置。本试用教程主要配置参数如表所示,其他参数可保持默认值。实际操作时,建议根据您的实际业务体量和需求选择。 参数 示例 操作系统 CentO
673 1
|
存储 缓存 NoSQL
高并发项目部署以及优化手段
高并发项目部署以及优化手段
1094 0
|
机器学习/深度学习 消息中间件 SQL
机器学习算法岗求职经验贴(下)
机器学习算法岗求职经验贴(下)