LeetCode算法刷题——53. 最大子数组和

一、题目描述

二、解题思路

我们使用前缀和的思想来高效解决这个问题:

  1. 计算当前位置的前缀和sum(到当前元素为止的总和)

  2. 用当前前缀和减去之前的最小前缀和minpre,得到以当前位置结尾的子数组最大和

  3. 比较sum和premin,更新最小前缀和变量

  4. 记录过程中的最大子数组和

三、完整代码

class Solution {

public:

int maxSubArray(vector<int>& nums) {

int sum = 0; // 当前前缀和

int result = INT_MIN; // 最大子数组和,初始化为最小整数

int minpre = 0; // 最小前缀和

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

// 更新当前前缀和

sum = sum + numsi;

// 用当前前缀和减去最小前缀和,更新最大和

result = max(result, sum - minpre);

// 更新最小前缀和(用于后续计算)

minpre = min(sum, minpre);

}

return result;

}

};

四、代码解析

1. 变量初始化

int result = INT_MIN;

  • 使用 **INT_MIN**确保即使全是负数也能正确处理

  • 这个值是 <climits> 中定义的,代表最小整数

2. 核心思想:最小前缀和

result = max(result, sum - minpre);

  • 关键原理:最大子数组和 = 当前前缀和 - 之前的最小前缀和

  • 如果我们在位置 i 有前缀和 sumi,在位置 j (j < i) 有前缀和 sumj

  • 那么子数组 numsj+1...i 的和 = sumi - sumj

  • 要使子数组值最大,就需要找到最小的 sumj,即之前的最小前缀和

3. 更新最小前缀和

minpre = min(sum, minpre);

  • 在计算完当前结果后,更新最小前缀和

  • 这样可以确保下次计算时使用的是当前之前的最小前缀和

  • 初始时 minpre = 0,对应空子数组(前缀和为0)

五、执行示例

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

详细步骤:

i numsi sum minpre sum-minpre result
0 -2 -2 0 -2-0=-2 -2
1 1 -1 -2 -1-(-2)=1 1
2 -3 -4 -4 -4-(-4)=0 1
3 4 0 -4 0-(-4)=4 4
4 -1 -1 -4 -1-(-4)=3 4
5 2 1 -4 1-(-4)=5 5
6 1 2 -4 2-(-4)=6 6
7 -5 -3 -4 -3-(-4)=1 6
8 4 1 -4 1-(-4)=5 6

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

六、总结

本文介绍了使用前缀和和最小前缀思想求解最大子数组和的高效算法。该算法的核心在于:最大子数组和等于当前前缀和减去之前的最小前缀和。通过维护一个最小前缀和变量,我们可以在一次遍历中解决问题,时间复杂度O(n),空间复杂度O(1)。这种方法比暴力法的O(n²)和分治法的O(n log n)都要高效,是解决最大子数组和问题的最优解法。

相关推荐
金銀銅鐵3 小时前
带您看懂字节码指令(一):一帧里有什么
java·后端·ai编程
专注仿真4 小时前
知识问答模型用到的算法集详解及代码实例
python·算法·代码·大模型训练·控制算法
nice_lcj5204 小时前
【从零理解 Spring AI · 14】RAG 的四个环节:加载、切分、向量化、检索
java·spring boot·embedding·向量数据库·rag·spring ai·ai应用开发
罗西的思考5 小时前
【轻量化复刻大模型 / KIMI K3】AttnRes 模块交互式演示
人工智能·算法·机器学习
小七在进步5 小时前
string的使用(1)
c++·visual studio
白杨尚青6 小时前
C++进阶篇(六):map 和 set 的模拟实现——用红黑树封装 mymap/myset(迭代器 + operator[])
开发语言·c++·迭代器·stl·set·map·红黑树
学长毕设6 小时前
基于springboot科创竞赛信息平台-附源码
java·spring boot·后端
聪明的笨猪猪7 小时前
Java 工程案例:AI 生成 @Async 异步线程池踩坑
java·经验分享·面试·ai编程
学长毕设7 小时前
基于SpringBoot公务员考试交流平台-附源码
java·spring boot·后端
好悬给我拽开线8 小时前
ZILOT 论文解析
算法