# 最大子序和(53)
# 题目
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
# 示例
输入: [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组
[4,-1,2,1]
的和最大,为6
。
# 进阶
如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。
# 算法
# 暴力法
双循环求出每一个字序的和
export const maxSubArray = (nums) => {
let max = -Infinity;
for (let i = 0; i < nums.length; i++) {
let tempVal = 0;
for (let j = i; j < nums.length; j++) {
tempVal += nums[j];
max = Math.max(tempVal, max);
}
}
return max;
};
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 动态规划
在每一轮遍历之前,维护一个当前字序的和sum
(还没有加上本轮循环出的nums[index]
),如果sum>0
则这个sum
加上当前的nums[index]
可能会比sum
大,所以我们加上nums[index]
后和resSum
比较取大值;如果sum<=0
,说明加上nums[index]
也一定没有nums[index]
大,所以是个累赘,我们可以直接舍弃当前的sum
并把本轮循环出的nums[index]
直接指定为sum
- 对数组进行遍历,当前最大的字序和是
sum
,结果最大字序和是resSum
,指针index
指向数组的第一项 - 如果当前的
sum
大于0,说明sum+nums[index]
可能大于sum
;否则我们抛弃sum
,将nums[index]
设置为新的sum
- 比较
resSum
和sum
中的较大值并赋值给resSum
- 循环结束,返回
resSum
export const maxSubArray = (nums) => {
let index = 0;
let sum = -Infinity,
resSum = -Infinity;
const arr = [];
while (index < nums.length) {
if (sum > 0) {
sum += nums[index];
} else {
sum = nums[index];
}
resSum = Math.max(resSum, sum);
index++;
}
return resSum;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16