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

# 动态规划

在每一轮遍历之前,维护一个当前字序的和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
  • 比较resSumsum中的较大值并赋值给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