LeetCode - 53. 最大子数组和

目录

题目

[Kadane 算法核心思想](#Kadane 算法核心思想)

[Kadane 算法的步骤分析](#Kadane 算法的步骤分析)

读者可能的错误写法

正确的写法


题目

53. 最大子数组和 - 力扣(LeetCode)

Kadane 算法核心思想

定义状态变量:

  • **currentSum:**表示以当前元素为结束的子数组的最大和。
  • **maxSum:**记录全局最大子数组和。

动态规划转移方程:

对于数组中的每个元素 numsi:

  • 如果**currentSum + numsi > numsi,**则将当前元素加到之前的子数组中(即扩展子数组)。
  • 如果 **currentSum + numsi <= numsi,**则重新开始一个新的子数组,从 numsi 开始。
  • 转移方程: currentSum = max(currentSum + numsi, numsi)

更新全局最大值:

  • 在每一步计算中,比较 currentSum 和 maxSum,更新全局最大值: maxSum = max(maxSum, currentSum)

时间复杂度:

  • 遍历一次数组,时间复杂度为 O(n)。
  • 空间复杂度为 O(1),只需常量空间记录 currentSum 和 maxSum。

Kadane 算法的步骤分析

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

最终结果:maxSum = 6,对应子数组 4, -1, 2, 1

读者可能的错误写法

cpp 复制代码
class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int currenSum = 0;
        int maxSum = 0;

        for(int i =0;i<nums.size();i++)
        {
            currenSum += nums[i];

            if(nums[i] > maxSum)
            {
                maxSum = nums[i];
            }
        }

        return currenSum;
    }
};

**逻辑错误:**这个的代码没有正确实现Kadane算法。你只是在累加所有元素(currenSum += numsi),这计算的是整个数组的和,而不是最大子数组和。

**maxSum初始化错误:**应该初始化为数组的第一个元素,而不是0(因为数组可能全为负数)。

**比较错误:**你在比较numsi和maxSum,但应该比较currenSum和maxSum。

**没有实现核心逻辑:**没有实现"选择继续当前子数组还是开始新子数组"的逻辑。

**你在最后返回的是currenSum而不是maxSum:**currenSum是以最后一个元素结尾的子数组的最大和,但这不一定是整个数组中的最大子数组和。

正确的返回值应该是maxSum,因为它记录了遍历过程中找到的全局最大子数组和。

正确的写法

cpp 复制代码
class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int currenSum = nums[0];
        int maxSum = nums[0];

        for(int i =1;i<nums.size();i++)
        {
           currenSum = max(currenSum+nums[i],nums[i]);
            maxSum = max(maxSum,currenSum);
        }

        return maxSum;
    }
};
相关推荐
Dr.kangder5 分钟前
嵌入式面试总结(十八)——JTAG调试
嵌入式硬件·面试·职场和发展·架构·嵌入式
m0_547486661 小时前
《数据结构与算法》全套PPT课件2026(中国海洋大学)
数据结构·算法
旖旎夜光1 小时前
LeetCode 904:水果成篮(滑动窗口) —— 题解
数据结构·c++·算法·leetcode·滑动窗口
怪奇云呼军1 小时前
G.711、Opus 和重采样会拖慢识别吗?闪电智能VoiceAgent 的音频入口怎么选
java·人工智能·python·算法·云计算·音视频
ZC跨境爬虫1 小时前
LeetCode 27. 移除元素(双指针详解 + Java Python 多解法对比)
java·python·leetcode
乐观勇敢坚强的老彭3 小时前
C++ 竞赛常用算法模板速查表
开发语言·c++·算法
Dr.kangder3 小时前
嵌入式面试总结(十六)——AMBA总线
面试·职场和发展·架构·嵌入式·虚拟化·总线
高洁013 小时前
工信部教考中心证书
人工智能·深度学习·算法·机器学习·知识图谱
我变成萤火虫3 小时前
河南萌新联赛2026第(三)场:郑州轻工业大学
数据结构·c++·算法·贪心算法·stl·深度优先·哈希算法
Dr.kangder3 小时前
嵌入式面试总结(十九)——内存泄露
单片机·算法·面试·职场和发展·架构·硬件架构