LeetCode热题100——53.最大子数组和(题解+答案+要点)

题目:

给你一个整数数组 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 <= 10^5

  • -10^4 <= nums[i] <= 10^4

题解:

1.核心思想:(动态规划)

从左到右扫描时,时刻维护一个"当前子数组",并决定:

  • 如果加上当前数字能让子数组变大,就加上;
  • 如果加上反而变小,就丢掉前面的,从当前数字重新开始。

同时,每走一步,都记录下目前为止见到的最大和。

2.核心代码:

cpp 复制代码
pre = max(pre + x, x);
maxAns = max(maxAns, pre);
  • pre 表示:以当前元素结尾的连续子数组的最大和。(注意:必须包含当前元素)

  • maxAns 表示:全局最大和,初始设为数组的第一个元素(不能设为 0,详见下文的要点)。

答案:

cpp 复制代码
class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int pre=0;
        int maxAns=nums[0];
        for(int i=0;i<nums.size();i++){
            pre=max(pre+nums[i],nums[i]);
            maxAns=max(maxAns,pre);
        }
        return maxAns;
    }
};

要点:

1.为什么 maxAns 初始为 nums[0] 而不是 0?

如果数组全是负数,比如 [-5, -2, -1],最大子数组和应该是-1。但是如果 maxAns 初始为 0,那么 max(0, -5) = 0,会错误地返回 0。

相关推荐
牛油果子哥q1 小时前
C++内存池与对象池精讲:内存碎片、自定义分配器、对象池实现、STL allocator原理、工程落地与性能对比
java·开发语言·c++
万法若空2 小时前
C/C++ 类型别名定义方式对比
java·c语言·c++
啥都想学点的研究生2 小时前
一篇文章讲清楚:线性回归问题的求解——正规方程法
算法·机器学习·线性回归
青少儿编程课堂2 小时前
树状数组精讲:逆序对计数与离散化(附双语言解法)
算法·树状数组·离散化·信息学奥赛·逆序对
血小板要健康2 小时前
网格 dfs 与 FloodFill:从岛屿、区域到搜索路径
笔记·算法·leetcode·深度优先
VALENIAN瓦伦尼安教学设备3 小时前
设备状态检测振动分析实训台案例分析
大数据·数据库·人工智能·嵌入式硬件·算法
小小晓.3 小时前
C++ 值类别与完美转发深度剖析:从左值右值到 std::forward 源码解密
开发语言·c++·算法
怕浪猫3 小时前
用了两年 AI 编程工具后,我重新理解了什么是「资深工程师」
算法·面试·架构
hetao17338374 小时前
2026-08-27~29 hetao1733837 的刷题记录
c++·算法
chen<>4 小时前
C++ 六种 memory_order:从原子性到线程间可见性.md
java·linux·开发语言·c++