给定一个整数数组,找出两个不重叠的子数组A和B,使两个子数组和的差的绝对值|SUM(A) - SUM(B)|最大。
返回这个最大的差值。
注意事项
子数组最少包含一个数
样例
给出数组[1, 2, -3, 1],返回 6
挑战
时间复杂度为O(n),空间复杂度为O(n)
点题:不重叠的理解是什么意思?
class Solution {
public:
/*
* @param nums: A list of integers
* @return: An integer indicate the value of maximum difference between two substrings
*/
int maxDiffSubArrays(vector<int> &nums) {
// write your code here
if (nums.size() == 0) {
return 0;
}
vector<int> left_mins(nums.size(), 0);
vector<int> left_maxs(nums.size(), 0);
vector<int> right_mins(nums.size(), 0);
vector<int> right_maxs(nums.size(), 0);
int cur_sum_min = 0;
int cur_sum_max = 0;
int max_sum = INT_MIN;
int min_sum = INT_MAX;
for (int i = 0; i < nums.size(); i++) {
cur_sum_max = max(cur_sum_max + nums[i], nums[i]);
max_sum = max(cur_sum_max, max_sum);
left_maxs[i] = max_sum;
cur_sum_min = min(cur_sum_min + nums[i], nums[i]);
min_sum = min(cur_sum_min, min_sum);
left_mins[i] = min_sum;
}
cur_sum_min = 0;
cur_sum_max = 0;
max_sum = INT_MIN;
min_sum = INT_MAX;
for (int i = nums.size() - 1; i >= 0; i--) {
cur_sum_max = max(cur_sum_max + nums[i], nums[i]);
max_sum = max(cur_sum_max, max_sum);
right_maxs[i] = max_sum;
cur_sum_min = min(cur_sum_min + nums[i], nums[i]);
min_sum = min(cur_sum_min, min_sum);
right_mins[i] = min_sum;
}
int max_diff = INT_MIN;
for (int i = 0; i < nums.size() - 1; i++) {
int cur_max_diff = max(abs(left_maxs[i] - right_mins[i + 1]),
abs(left_mins[i] - right_maxs[i + 1]));
max_diff = max(max_diff, cur_max_diff);
}
return max_diff;
}
};