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)都要高效,是解决最大子数组和问题的最优解法。

相关推荐
To_OC1 天前
LC 207 课程表:刚学图论那会儿,我连这是拓扑排序都没看出来
javascript·算法·leetcode
To_OC1 天前
LC 208 实现 Trie 前缀树:曾被名字劝退,写完发现是送分题
javascript·算法·leetcode
BadBadBad__AK1 天前
线段树维护区间 k 次方和
c++·数学·算法·stl
吃饱了得干活1 天前
Spring Cloud Gateway 微服务网关:路由、断言、过滤器
java·spring cloud
lwx572801 天前
探秘InnoDB:搞懂它的内存、线程、磁盘与日志刷盘策略
java·后端
Flynt2 天前
从Spring Boot 4.0升到4.1,我在Maven和gRPC上栽了跟头
java·spring boot·后端
plainGeekDev2 天前
Activity 间传值 → Navigation 参数
android·java·kotlin
plainGeekDev2 天前
onActivityResult → ActivityResult API
android·java·kotlin
Sunia2 天前
《AgentX 专栏》10-生产部署:3台2C4G云服务器把企业级Agent真正跑起来的完整方案
java·架构
ZhengEnCi2 天前
J7A-高级Java工程师面试三道灵魂拷问-深度广度与工程素养的终极检验
java·后端