53.最大子数组和
思路
例如给到数组[-2,1,-3,4,-1,2,1,-5,4]。
要求最大子数组和,可以默认先取第一个数,同时设一个变量sum,来保存当前遍历到的累加值,累加值初始为 0,对于这个例子,首先取数组第一个元素-2,开始累加,第二个为 1,则累加产生的值为-1:
let answer = nums[0];
let sum = 0;
for 循环,对nums 进行遍历:
for (let i = 0; i < nums.length; i++) {}
遍历时,对 sum 进行累加:
sum += nums[i];
累加后,进行判断,如果累加产生的值大于当前的answer值,那就把当前累加值赋给answer,如果累加产生的值为负数,那就重新将累加值sum变为 0,再继续迭代:
for (let i = 0; i < nums.length; i++) {
sum += nums[i];
// 如果累加产生的值大于当前的answer值,那就把当前累加值赋给answer
answer = Math.max(answer, sum);
// 如果当前加起来小于0了,那就归位到0,继续迭代
if (sum < 0) {
sum = 0;
}
}
结果
function maxSubArray(nums: number[]): number {
// 先直接取第一个数
let answer = nums[0];
let sum = 0;
for (let i = 0; i < nums.length; i++) {
sum += nums[i];
// 如果累加产生的值大于当前的answer值,那就把当前累加值赋给answer
answer = Math.max(answer, sum);
// 如果当前加起来小于0了,那就归位到0,继续迭代
if (sum < 0) {
sum = 0;
}
}
return answer;
}