解法1:不是看当前的值,而是看当前的累计值,

如果当前累计为负数,那么加上现在这个数,肯定和就小了,所以继续从当前开始累计,如果为正,那就继续加,但是要时刻保存下最大值来,因为后面的累计有可能小。

public int FindGreatestSumOfSubArray(int[] array) {
        if(array.length==0){
            return 0;
        }
        int total=array[0];//当前的前面的和累计
        int maxsum=array[0];//记录可能的最大值
        for(int i=1;i<array.length;i++){
            if(total>=0){
                total+=array[i];
            }
            else{
                total=array[i];
            }
            if(maxsum<total){
                maxsum=total;
            }
        }
        return maxsum;
    }

解法2:使用动态规划法,定义一个dp数组记录从第一个数字开始到当前数字的最大累加和。

每当前一个累加和大于0时,进行dp[i]的更新。
最后遍历dp数组,取最大的dp[i]返回。

    public int maxsumofSubarray (int[] arr) {
        // write code here
        int len = arr.length;
        int res = Integer.MIN_VALUE;
        //用tmp数组记录从0出发到当前数字能累加的最大数
        int[] dp = new int[len];
        //先初始化它
        for(int i=0; i < len; i++){
            dp[i] = arr[i];
        }
        //开始遍历
        for(int i=1; i < len; i++){
            //当前面已累加和大于0时,加上肯定比当前的数字大
            dp[i] = (dp[i-1] > 0 ? (dp[i-1]+ arr[i]) : dp[i]);
        }
        //进行比较,选择出最大的累加和
        for(int i=0; i < len; i++){
            res = Math.max(res, dp[i]);
        }
        return res;
    }