Leetcode 53.最大子数组和

题目要求

  • 给你一个整数数组 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

遇到和为负数就停止

思路:
局部最优:当前“连续和”为负数的时候立刻放弃,从下一个元素重新计算“连续和”,因为负数加上下一个元素 “连续和”只会越来越小。

全局最优:选取最大“连续和”

局部最优的情况下,并记录最大的“连续和”,可以推出全局最优。

从代码角度上来讲:遍历 nums,从头开始用 count 累积,如果 count 一旦加上 nums[i]变为负数,那么就应该从 nums[i+1]开始从 0 累积 count 了,因为已经变为负数的 count,只会拖累总和。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Solution {
public int maxSubArray(int[] nums) {
if (nums.length == 1) return nums[0];
int res = Integer.MIN_VALUE;
int count = 0;
for (int i = 0; i < nums.length; i++) {
// 计算当前的连续和
// 如果当前的连续和大于最大值,更新最大值
// 如果当前的连续和小于最大值,有两种情况:
// 1. 当前的连续和小于0,说明当前的连续和对后面的计算没有帮助,直接从下一个元素开始计算
// 2. 当前的连续和大于0,说明继续往后加的话当前结果最后面是有正收益的,所以继续往后加
count += nums[i];
if (count > res) {
res = count;
}

if (count < 0) {
count = 0;
}
}
return res;
}
}