Lintcode - Maximum Subarray Difference

本文探讨如何在整数数组中找到两个不重叠子数组,使得这两个子数组元素之和的绝对差值达到最大。通过分别计算左右两边连续最大和最小子数组的和,最终确定最大差值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Given an array with integers.

Find two non-overlapping subarrays A and B, which|SUM(A) - SUM(B)| is the largest.

Return the largest difference.

Note

The subarray should contain at least one number

Example

For [1, 2, -3, 1], return 6

Challenge

O(n) time and O(n) space.

思路很简单,写起来很烦躁。分别左右两边求连续最大最小值,相当于把maximum subarray写四遍。。。然后比较leftMax-rightMin vs rightMax - leftMin

    public int maxDiffSubArrays(ArrayList<Integer> nums) {
        int max = Integer.MIN_VALUE;
        if (nums.size() <2) {
            return 0;
        }
        int n = nums.size();
        int[] leftMax = new int[n], leftMin = new int[n],

        int localMax = 0; int localMin = 0;
        for (int i = 0; i < n; i++) {
            int num = nums.get(i);
            
            localMax = Math.max(num + localMax, num);
            localMin = Math.min(num + localMin, num);
            if (i == 0) {
                leftMax[i] = localMax;
                leftMin[i] = localMin;
            } else {
                leftMax[i] = Math.max(localMax, leftMax[i-1]);
                leftMin[i] = Math.min(localMin, leftMin[i-1]);
            }
        }

        localMax = 0; localMin = 0;
        int lastMax = 0, lastMin = 0;
        for (int i = n-1; i > 0; i--) {
            int num = nums.get(i);
            localMax = Math.max(num + localMax, num);
            localMin = Math.min(num + localMin, num);
            if (i == n-1) {
                lastMax = localMax;
                lastMin = localMin;
            } else {
                lastMax = Math.max(localMax, lastMax);
                lastMin = Math.min(localMin, lastMin);
            }
            max = Math.max(Math.max(Math.abs(leftMax[i-1]-lastMin), 
                Math.abs(lastMax - leftMin[i-1])), max);
        }
        return max;
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值