牛客_连续子数组的最大和

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhangvalue/article/details/87937897

题目描述

连续子数组的最大和,例如:{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;
        }
        
    }
}

猜你喜欢

转载自blog.csdn.net/zhangvalue/article/details/87937897
今日推荐