537 字
3 分钟
最大子数组和

题目描述#

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

子数组是数组中的一个连续部分。

解题思路#

  1. 动态规划策略
    • 定义 dp[i] 为以第 i 个元素结尾的最大子数组和
    • 状态转移方程:dp[i] = max(nums[i], dp[i-1] + nums[i])
  2. 空间优化
    • 使用滚动变量 currentMax 代替 dp 数组
    • 实时更新全局最大值 globalMax
  3. 贪心思想
    • 当前元素如果能使子数组和增大则保留
    • 否则从当前元素重新开始计算子数组
  4. 边界处理
    • 数组全负时返回最大负值
    • 空数组返回0或特定值

关键洞察#

  1. 连续性要求
    • 子数组必须连续,不能跳跃元素
    • 动态规划天然保证连续性
  2. 重置决策点
    • 当 dp[i-1] < 0 时,舍弃前序子数组
    • 从当前元素 nums[i] 重新开始
  3. 负值处理
    • 负元素可能存在于更大和子数组中
    • 仅当 dp[i-1] + nums[i] < nums[i] 时重置
  4. 单次遍历可行性
    • 只需遍历一次数组即可求得全局最优
    • 空间复杂度优化至 O(1)

复杂度分析#

指标说明
时间复杂度O(n):单次遍历数组
空间复杂度O(1):仅使用常数额外变量

代码实现#

/**
* @param {number[]} nums
* @return {number}
*/
var maxSubArray = function (nums) {
let current = 0;
let maxSum = nums[0];
for (const num of nums) {
current = Math.max(num, current + num);
maxSum = Math.max(maxSum, current);
}
return maxSum;
}

相似题目#

最大子数组和
https://website-truelovings-projects.vercel.app/posts/algorithms/最大子数组和/
作者
欢迎来到StarSky的网站!
发布于
2025-08-13
许可协议
CC BY-NC-SA 4.0