Lincode42.最大子数组 II-----前缀和

题目表述

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

示例1:
输入:nums = [1, 3, -1, 2, -1, 2]
输出:7
解释:最大的子数组为 [1, 3] 和 [2, -1, 2] 或者 [1, 3, -1, 2] 和 [2].

双数组

public class Solution {
    /**
     * @param nums: A list of integers
     * @return: An integer denotes the sum of max two non-overlapping subarrays
     */
    public int maxTwoSubArrays(List<Integer> nums) {
        // write your code here
        int[] leftSeqMax = new int[nums.size()];
        int[] rightSeqMax = new int[nums.size()];
        int max_mum = Integer.MIN_VALUE;
        int cur = 0;
        for(int i = 0; i < nums.size(); i++){
            if(cur <= 0){
                cur = nums.get(i);
            }else{
                cur += nums.get(i);
            }
            leftSeqMax[i] = max_mum = Math.max(max_mum, cur);
        }

        max_mum = Integer.MIN_VALUE;
        cur = 0;
        for(int i = nums.size() - 1; i >= 0; i--){
            if(cur <= 0){
                cur = nums.get(i);
            }else{
                cur += nums.get(i);
            }
            rightSeqMax[i] = max_mum = Math.max(max_mum, cur);
        }
        int res = Integer.MIN_VALUE;
        for(int i =0; i < nums.size() - 1;i++){
            res = Math.max(res, leftSeqMax[i] + rightSeqMax[i + 1]);
        }
        return res;
    }
}
posted @ 2022-07-06 14:18  YoungerWb  阅读(56)  评论(0编辑  收藏  举报