给定一个整数数组,找出两个不重叠的子数组A和B,使两个子数组和的差的绝对值|SUM(A) - SUM(B)|最大。
返回这个最大的差值。
样例
给出数组[1, 2, -3, 1],返回 6。
思路是分别求出最大左子数组A和最小右子数组B,然后再求出最小左子数组A和最大右子数组B,然后比较差的绝对值的大小,不知道是不是一个好的方法。关于求最大和最小子数组的问题可以看我的前面几篇文章。
class Solution {
public:
/**
* @param nums: A list of integers
* @return: An integer indicate the value of maximum difference between two
* Subarrays
*/
int maxDiffSubArrays(vector<int> nums) {
// write your code here
int max1 = maxSubArray(nums);
reverse(nums.begin(),nums.end());
int max2 = maxSubArray(nums);
return max(max1,max2);
}
int maxSubArray(vector<int> nums) {
vector<int> leftMax(nums.size(),0);
vector<int> rightMin(nums.size(),0);
int sum = 0,result = nums[0];
for (int i = 0;i < nums.size();i++) {
sum += nums[i];
result = max(result,sum);
sum = max(sum,0);
leftMax[i] = result;
}
sum = 0,result = nums[nums.size()-1];
for (int i = nums.size()-1;i >= 0;i--) {
sum += nums[i];
result = min(sum,result);
sum = min(sum,0);
rightMin[i] = result;
}
int res = 0;
for (int i = 1;i < nums.size();i++) {
res = max(res,abs(leftMax[i-1] - rightMin[i]));
}
return res;
}
};
网友评论