牛客网剑指offer刷题Java版-30连续子数组的最大和

题目描述

HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的和,你会不会被他忽悠住?(子向量的长度至少是1)

方法1:

public class Solution {
    public int FindGreatestSumOfSubArray(int[] array) {
        if(array.length==0)
            return 0;
        int move=0;
        int max=array[0];
        for(int i=0;i<array.length;i++){
            if(array[i]<=0){//move以数组开头或者其中的一个正数为开头,当i<0时,对数组片段累加
                move=move+array[i];
                max=max>array[i]?max:array[i];//考虑到整个数组可能全为负数,加上此步骤
            }
            else{
                if(move<=0){//累加后的数组片段如果小于0,证明,以这个正数开头,直到下一个正数,子数组相加小于零,所以为不值得的
                    move=array[i];//此时,将下一个正数换成开头
                    max=max>array[i]?max:array[i];//最大值更新为原来的最大值和新的正数中较大的一个
                }
                else{//累加后的数组片段如果大于0,说明以这个正数开头,直到下一个正数,是值得的
                    move=move+array[i];//所以更新move
                    max=max>move?max:move;//更新max
                }
            }
        }
        return max;
    }
}

方法2:

//基于思想:对于一个数A,若是A的左边累计数非负,那么加上A能使得值不小于A,认为累计值对
//整体和是有贡献的。如果前几项累计值负数,则认为有害于总和,记录当前值。
public class Solution {
    public int FindGreatestSumOfSubArray(int[] array) {
        if(array.length==0)
            return 0;
        int move=array[0];
        int max=array[0];
        for(int i=1;i<array.length;i++){
            if(move>0)//如果子序列还大于零,就先累加着
                move=move+array[i];
            else{//如果小于0了,推到重来
                move=array[i];
            }
            max=max>move?max:move;
        }
        return max;
    }
}

你可能感兴趣的:(Java刷题)