537 字
3 分钟
最大子数组和

题目描述
给你一个整数数组 nums
,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组是数组中的一个连续部分。
解题思路
- 动态规划策略:
- 定义
dp[i]
为以第i
个元素结尾的最大子数组和 - 状态转移方程:
dp[i] = max(nums[i], dp[i-1] + nums[i])
- 定义
- 空间优化:
- 使用滚动变量
currentMax
代替dp
数组 - 实时更新全局最大值
globalMax
- 使用滚动变量
- 贪心思想:
- 当前元素如果能使子数组和增大则保留
- 否则从当前元素重新开始计算子数组
- 边界处理:
- 数组全负时返回最大负值
- 空数组返回0或特定值
关键洞察
- 连续性要求:
- 子数组必须连续,不能跳跃元素
- 动态规划天然保证连续性
- 重置决策点:
- 当
dp[i-1] < 0
时,舍弃前序子数组 - 从当前元素
nums[i]
重新开始
- 当
- 负值处理:
- 负元素可能存在于更大和子数组中
- 仅当
dp[i-1] + nums[i] < nums[i]
时重置
- 单次遍历可行性:
- 只需遍历一次数组即可求得全局最优
- 空间复杂度优化至 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;}