lintcode -- 最大子数组II

来源:互联网 发布:sql数据库培训多少钱 编辑:程序博客网 时间:2024/05/18 11:49

给定一个整数数组,找出两个 不重叠 子数组使得它们的和最大。
每个子数组的数字在数组中的位置应该是连续的。
返回最大的和。

 注意事项

子数组最少包含一个数

样例

给出数组 [1, 3, -1, 2, -1, 2]

这两个子数组分别为 [1, 3] 和 [2, -1, 2] 或者 [1, 3, -1, 2]和 [2],它们的最大和都是 7




/*
数组left ,left[i] 表示从0 到i 这个区间内元素的最大值
同样可以求从i 到 size-1 这个区间的最大值
上面两个值之和的最大值就是答案了




第二个for循环也就是求i 到size -1区间内的全局最大值,然后就想到可以再定义一个数组
right right[i] 表示从i 到 size -1这个区间的最大
下面只需要根据这个两个数组求出最大值的和就好了
max = Math.max(left[i] + right[i+1],max)


再说明下:
left[i] 表示从0 到i 这个区间的最大值
right[i+1] 表示从 i + 1 都 size-1 这个区间的最大值
*/
//左边和右边分别计算max subarray,然后两边加起来最大的就是结果


public class Solution {
    public int maxTwoSubArrays(ArrayList<Integer> nums) {
        int size = nums.size();
        if(nums ==  null || size == 0)return 0;
        int[]left = new int[size];
        int[]right = new int[size];
        int max = Integer.MIN_VALUE;
        
        int localMax =0;
        //保存过程中的最大值
        int globalMax = Integer.MIN_VALUE;
        for(int i =0;i<size;i++){
            localMax = Math.max(localMax+nums.get(i),nums.get(i));
            globalMax = Math.max(localMax,globalMax);
            left[i] = globalMax;
        }
        
        localMax= 0;
        globalMax = Integer.MIN_VALUE;
        for(int i = size-1;i>=0;i--){
            localMax = Math.max(localMax+nums.get(i),nums.get(i));
            globalMax = Math.max(localMax,globalMax);
            right[i] = globalMax;
        }
        for(int i =0;i<size-1;i++){
            //left[i] 表示从0 到i 这个区间的最大值
            //right[i+1] 表示从 i + 1 到 size-1 这个区间的最大值
            max = Math.max(max,left[i]+right[i+1]);
        }
        return max;
    }
}

原创粉丝点击