# 最大子序和(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