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
python
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