Maximum subarray sum(最大子数组和)
1.问题描述
The maximum sum subarray problem consists in finding the maximum sum of a contiguous subsequence in an array or list of integers:
意思是:在一个数组中找到一个连续的子数组,这个子数组必须是这个数组里所有子数组和最大的,返回找到的子数组的和
tips:
- 上面提示我们两点
- 空数组也返回0
- 全为负数的数组,结果也返回0
2.解题思路
- 使用两个辅助变量,一个maximum保存当前和最大的结果, temp来遍历这个数组, 题目说了如果最后的结果是负数,则用0代替返回, 所以我们默认当前最大的和就是0 即
int maximum = 0;
int tmp = 0;
- 接下来我们从0开始遍历整个数组, 我们每次使用tmp+当前遍历的元素(假设当前元素为arr[i], 如果tmp+arr[i] < 0, 我们直接将tmp恢复为0, 然后更新maximum的值, 这里tmp恢复为0的意义就是前面的结果已经是负数了,所有我们的可能找到最大值的子数组一定不包括前面已经遍历过得元素, 所以我们子数组的起始索引只能从下一个遍历到的元素开始算起, 这样当遍历完整个数组后, 最大子数组和也就得到了,即使整个数组是负数,最后我们也能顺利返回0,不必考虑什么特殊情况
int maximum = 0;
int tmp = 0;
for (int i : arr) {
tmp += i;
if (tmp < 0) {
tmp = 0;
}
maximum = Math.max(maximum, tmp);
}
return maximum;