牛客_连续子数组的最大和
题目描述
连续子数组的最大和,例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的和,你会不会被他忽悠住?(子向量的长度至少是1)
思路:
用total记录累计值,maxSum记录和最大
基于思想:对于一个数A,若是A的左边累计数非负,那么加上A能使得值不小于A,认为累计值对整体和是有贡献的。如果前几项累计值负数,则认为有害于总和,total记录当前值。
此时 若和大于maxSum 则用maxSum记录下来。最后返回maxSum。算法时间复杂度O(n)
public class Solution {
public int FindGreatestSumOfSubArray(int[] array) {
if(array.length<=0){
return 0;
}else{
//创建total记录累加的值,maxSum是记录最大和
int total=array[0],maxSum=array[0];
//需要注意在便利原数组的时候,因为第一个位置的值已经赋给了total了,后面累加的时候就需要从第二个位置开始
//所以i从1开始,同时也考虑到了,长度为1的情况就直接循环结束了
//同时也考虑到了即使数组中的值全为负数同样也是适用的,当全为负数的时候total就回肯定比maxSum小
for(int i=1;i<array.length;i++){
//从第一个值开始当出现了累加的为正数的时候说明累加是有贡献的
if(total>=0){
total+=array[i];
}else{
//一旦累加小于0直接将之前的放弃掉,从新开始total
total=array[i];
}
//每一次遍历一个元素的时候,如果出现了 total的值大于最大的值就直接将累加值赋值给maxSum
if(total>maxSum){
maxSum=total;
}
}
return maxSum;
}
}
}