剑指offer三十之连续子数组的最大和
一、题目
HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。你会不会被他忽悠住?(子向量的长度至少是1)
二、思路
情况一:数组中至少包含一个正数,
这种情况下,将数组元素进行累加,如果累加和出现小于0的情况,则和最大的子序列肯定不可能包含前面的元素,这时将累加和置0,从下个元素重新开始累加,最后返回累加和即可。
情况二:数组中元素都为负数,则最大子数组和即为该数组里最大的那个元数的值。
三、代码
public class Solution { public int FindGreatestSumOfSubArray(int[] array) { int maxSum = 0; int curSum = 0; int maxNum = array[0]; for (int i = 0; i < array.length; i++) { //情况一:数组中至少包含一个正数 curSum += array[i]; if (curSum > maxSum) { maxSum = curSum; } //如果累加和出现小于0的情况,则和最大的子序列肯定不可能包含前面的元素,这时将累加和置0,从下个元素重新开始累加 if (curSum < 0) { curSum = 0; } //情况二:数组中元素都为负数,最大子数组的和即为该数组里最大的那个元素 if (array[i] > maxNum) { maxNum = array[i];//数组中的最大值 } } return maxNum > 0 ? maxSum : maxNum; } }
----------------------------------------------------
参考链接:
https://www.nowcoder.com/practice/459bd355da1549fa8a49e350bf3df484?tpId=13&tqId=11183&rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking