当前位置: 首页 > news >正文

力扣HOT100之普通数组:53. 最大子数组和


这道题目我用贪心做的,感觉用贪心的思路比较简单,以后要是面试碰到这道题就直接用贪心好了,这道题用贪心的核心思想就是不断将数组元素i加入总和sum,如果sum比当前维护的最大值result更大,说明当前遍历到的i是正数,对于增大总和是有帮助的,直接更新result的值。否则就说明当前的i是负数,这里就需要进一步判断sum的大小,如果sum已经小于0,就说明sum对增大总和已经没有帮助了,直接将sum重置为0即可。
这是贪心的代码,还是挺简洁的。

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        //贪心解法
        int result = -INT_MAX;
        int sum = 0;
        for(int& i : nums){
            sum += i;
            if(sum > result) result = sum;  // i为正数,直接更新最大和
            // 若此时sum依然为负数,则对数值变大没有帮助,重置为0(丢弃)
            if(sum < 0) sum = 0;
        }
        return result;
    }
};

但是我看灵神解这道题是用前缀和和动态规划来解的,这里主要学习一下前缀和的解法,动态规划的解法在代码随想录里已经学习过了。感觉前缀和的解法也很通俗易懂欸!!
我们定义一个前缀表pre,其中pre[j] = nums[0] + nums[1] + nums[2] + ... + nums[j - 1],这里我们依然定义pre[0] = 0,我们知道子数组的和可以转化为两个前缀和的差,例如,nums[i]nums[j]的和可以转化为pre[j + 1] - pre[i],因此,我们可以先构造出一个前缀表,然后从下标1开始遍历,直到遍历结束,在从左往右遍历的过程中,用一个变量min_pre来记录当前的最小前缀,每遍历一个前缀和,我们就可以将其减去其左侧的最小前缀和,这样就能得到以第j - 1个元素为尾元素的子数组能取到的最大和,同时我们用一个变量result来维护当前的最大子数组和,就能计算出整个数组的最大子数组和。

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        //前缀和解法
        int result = INT_MIN;
        int min_pre = 0;  //维护最小前缀
        vector<int> pre(nums.size() + 1, 0);  //前缀表
        for(int i = 1; i < pre.size(); ++i)  //构造前缀表
            pre[i] = pre[i - 1] + nums[i - 1];
        for(int i = 1; i < pre.size(); ++i){ //遍历前缀表,计算最大子数组和
            result = max(result, pre[i] - min_pre);
            min_pre = min(min_pre, pre[i]);
        }
        return result;
    }
};

相关文章:

  • Linux编译器gcc/g++使用完全指南:从编译原理到动静态链接
  • 【leetcode hot 100 215】数组中的第K个最大元素
  • kubeadm部署k8s-1.32版本集群(1个master,1个worker)
  • PX4飞控-接收MAVLINK消息(2)-生成MAVLINK_MSG_ID_***.h文件
  • QEMU源码全解析 —— 块设备虚拟化(10)
  • [笔记] 系统分析师 第二章 经济管理与应用数学 (未完待续)
  • Linux系统离线安装ollama【详细版】
  • <command-line>:0:1: error: macro names must be identifiers m
  • 2000-2019年各省地方财政行政事业性收费收入数据
  • 【数据采集】技术对比:PCIe、PXIe、PCI、PXI、网口与USB
  • 线上分享会 如何用deepseek和豆包等AI平台获客?
  • 基于SSM+Vue物流信息管理系统(附源码)
  • 信竞资讯
  • MacOS 15 无法打开Docker问题(Malware Blocked)解决
  • 机器人SDF模型写法官方例子
  • csp信奥赛C++常用的数学函数详解
  • UPDclient server
  • 使用 Go 和 Gin 实现高可用负载均衡代理服务器
  • 夯实 kafka 系列|第五章:基于 kafka 分布式事件框架 eval-event
  • Java通信
  • 贵州省总工会党组成员、副主席梁伟接受审查调查
  • 体验中国传统文化、采购非遗文创,波兰游客走进上海市群艺馆
  • 中国一重集团有限公司副总经理陆文俊被查
  • 习近平同瑞典国王卡尔十六世·古斯塔夫就中瑞建交75周年互致贺电
  • 首届上海老年学习课程展将在今年10月举办
  • 成立6天的公司拍得江西第三大水库20年承包经营权,当地回应