53. 最大子数组和
代码
ts
/**
* 53. 最大子数组和
* https://leetcode.cn/problems/maximum-subarray/
*/
function maxSubArray(nums: number[]): number {
let sum = 0;
let max = Number.MIN_SAFE_INTEGER; // 初始化为最小数
for(let i = 0; i < nums.length; i++){
sum += nums[i];
if(sum > max){ // 更新最大值
max = sum;
}
if(sum <= 0){ // 当前子数组和为负,对求最大子数组没有好处
sum = 0; // 重新开始累加
}
}
return max;
}
const nums = [-2,1,-3,4,-1,2,1,-5,4]
console.log(maxSubArray(nums))思路
使用动态规划 / 前缀和贪心的经典做法:用 sum 记录当前子数组和,max 记录历史最大子数组和。
- 每次把当前元素加到
sum上; - 若
sum比max大,则更新max; - 如果
sum小于等于 0,说明这段前缀对后续求最大和没有贡献,直接将sum置 0,从下一个位置重新开始。
时间复杂度