Maximum Subarray Difference

本文介绍了一种算法,用于寻找给定整数数组中两个非重叠子数组的最大差值。通过计算最大和最小子数组的和,文章提供了一个解决方案,并展示了用Java和Python实现的具体代码。

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.

 Notice

The subarray should contain at least one number

Example

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

这个题目与 Maximum Subarray 有很多的相似之处,都是求解不重叠的部分的数据。但是这个要多一个最小值序列,因此需要求解4个序列。

java

public class Solution {
    /*
     * @param nums: A list of integers
     * @return: An integer indicate the value of maximum difference between two substrings
     */
    public int maxDiffSubArrays(int[] nums) {
        // write your code here
        if (nums == null || nums.length == 0) {
            return 0;
        }
        int length = nums.length;
        int[] leftMax = new int[length];
        int[] leftMin = new int[length];
        int[] rightMax = new int[length];
        int[] rightMin = new int[length];
        int sum = 0;
        int max = Integer.MIN_VALUE;
        int min = 0;
        for (int i = 0; i < length; i++) {
            sum += nums[i];
            max = Math.max(max, sum - min);
            min = Math.min(sum, min);
            leftMax[i] = max;
        }
        sum = 0; max = Integer.MIN_VALUE; min = 0;
        for (int i = length - 1; i >= 0; i--) {
            sum += nums[i];
            max = Math.max(max, sum - min);
            min = Math.min(sum, min);
            rightMax[i] = max;
        }
        sum = 0; max = 0; min = Integer.MAX_VALUE;
        for (int i = 0; i < length; i++) {
            sum += nums[i];
            min = Math.min(min, sum - max);
            max = Math.max(sum, max);
            leftMin[i] = min;
        }
        sum = 0; max = 0; min = Integer.MAX_VALUE;
        for (int i = length - 1; i >= 0; i--) {
            sum += nums[i];
            min = Math.min(min, sum - max);
            max = Math.max(sum, max);
            rightMin[i] = min;
        }
        int diff = 0;
        for (int i = 0; i < length - 1; i++) {
            diff = Math.max(diff, Math.abs(leftMax[i] - rightMin[i + 1]));
            diff = Math.max(diff, Math.abs(leftMin[i] - rightMax[i + 1]));
        }
        return diff;
    }
}

python

class Solution:
    """
    @param: nums: A list of integers
    @return: An integer indicate the value of maximum difference between two substrings
    """
    def maxDiffSubArrays(self, nums):
        # write your code here
        if nums is None or len(nums) == 0:
            return 0
        length = len(nums)
        leftMax, leftMin = [0] * length, [0] * length
        rightMax, rightMin = [0] * length, [0] * length
        summary, minVal, maxVal = 0, 0, float('-inf')
        for i in range(length):
            summary += nums[i]
            maxVal = max(maxVal, summary - minVal)
            minVal = min(summary, minVal)
            leftMax[i] = maxVal
        summary, minVal, maxVal = 0, 0, float('-inf')
        for i in range(length - 1, -1, -1):
            summary += nums[i]
            maxVal = max(maxVal, summary - minVal)
            minVal = min(summary, minVal)
            rightMax[i] = maxVal
        summary, minVal, maxVal = 0, float('inf'), 0
        for i in range(length):
            summary += nums[i]
            minVal = min(minVal, summary - maxVal)
            maxVal = max(summary, maxVal)
            leftMin[i] = minVal
        summary, minVal, maxVal = 0, float('inf'), 0
        for i in range(length - 1, -1, -1):
            summary += nums[i]
            minVal = min(minVal, summary - maxVal)
            maxVal = max(summary, maxVal)
            rightMin[i] = minVal
        diff = 0
        for i in range(length - 1):
            diff = max(diff, abs(leftMax[i] - rightMin[i + 1]))
            diff = max(diff, abs(leftMin[i] - rightMax[i + 1]))
        return diff
        
            
        


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值