13.最大子数组和(学习)
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组
是数组中的一个连续部分。
示例 1:
输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
示例 2:
输入:nums = [1]
输出:1
示例 3:
输入:nums = [5,4,-1,7,8]
输出:23
提示:
1 <= nums.length <= 105
-104 <= nums[i] <= 104
解析:
一、初始化:
将currentMax和globalMax都初始化为数组的第一个元素nums[0]。
二、遍历数组:
从数组的第二个元素开始遍历(即索引为1的元素),对于每个元素nums[i]:
1.计算如果加上当前元素nums[i],currentMax会是多少(即currentMax + nums[i])。
2.如果currentMax + nums[i]大于nums[i](意味着加上当前元素能增加当前子数组的和),则更新currentMax为currentMax + nums[i]。
3.否则,将currentMax重置为nums[i],因为这意味着从当前元素开始一个新的子数组可能会得到更大的和。
4.在每次更新currentMax后,检查currentMax是否大于globalMax,如果是,则更新globalMax。
三、返回结果:
遍历完成后,globalMax中存储的就是所求的最大子数组和。
var maxSubArray = function(nums) {
let currentMax = nums[0]; // 初始化currentMax为数组的第一个元素
let globalMax = nums[0]; // 初始化globalMax为数组的第一个元素
for (let i = 1; i < nums.length; i++) { // 从第二个元素开始遍历
// 更新currentMax
currentMax = Math.max(nums[i], currentMax + nums[i]);
// 更新globalMax
globalMax = Math.max(globalMax, currentMax);
}
return globalMax; // 返回全局最大和
};