描述
给定一个整数数组,找出两个不重叠的子数组A和B,使两个子数组和的差的绝对值|SUM(A) - SUM(B)|最大。
返回这个最大的差值。
子数组最少包含一个数
样例
给出数组[1, 2, -3, 1],返回 6
挑战
给定一个整数数组,找出两个不重叠的子数组A和B,使两个子数组和的差的绝对值|SUM(A) - SUM(B)|最大。
返回这个最大的差值。
子数组最少包含一个数
样例
给出数组[1, 2, -3, 1],返回 6
挑战
时间复杂度为O(n),空间复杂度为O(n)
分析
该问题和最大子数组II类似,但是这里是求最大子数组差。假设存在A和B两个数组
当A足够大的时候,B足够小的时候,需要从左向右求最大连续数组left,从右向左求最小连续数组right,遍历left,right数组,left[i]-right[i+1]表示在第i位拆分数组,得到其子数组的差。
当B足够大的时候,A足够小的时候,需要从左向右求最小连续数组left,从右向左求最大连续数组right,遍历left,right数组,left[i]-right[i+1]表示在第i位拆分数组,得到其子数组的差。
求取两次子数组的最大值,即为最大子数组差。
程序
class Solution {
public:
/*
* @param nums: a list of integers
* @return: A integer indicate the sum of minimum subarray
*/
int maxDiffSubArrays(vector<int> &nums) {
// write your code here
// A矩阵足够大,B矩阵足够小
int size = nums.size();
int *left_max = new int[size];
int max_value, sum;
left_max[0] = max_value = sum = nums[0];
for (int i = 1; i < size; i++){
if (sum > 0)
sum += nums[i];
else
sum = nums[i];
if (max_value < sum)
max_value = sum;
left_max[i] = max_value;
}
for (int i = 0; i < size; i++)
cout << left_max[i] << " ";
cout << endl;
int *right_min = new int[size];
int min_value;
right_min[size - 1] = min_value = sum = nums[size - 1];
for (int i = size - 2; i >= 0; i--){
if (sum < 0)
sum += nums[i];
else
sum = nums[i];
if (min_value > sum)
min_value = sum;
right_min[i] = min_value;
}
for (int i = 0; i < size; i++)
cout << right_min[i] << " ";
cout << endl;
int result1 = 0x80000000;
for (int i = 0; i < size - 1; i++){
result1 = (result1 > abs(left_max[i] - right_min[i + 1])) ? result1 : abs(left_max[i] - right_min[i + 1]);
}
cout << result1 << endl;
delete[] left_max;
delete[] right_min;
// A矩阵足够小,B矩阵足够大
int *left_min = new int[size];
left_min[0] = min_value = sum = nums[0];
cout << "Hello" << endl;
for (int i = 1; i < size; i++){
if (sum < 0)
sum += nums[i];
else
sum = nums[i];
if (min_value > sum)
min_value = sum;
left_min[i] = min_value;
}
for (int i = 0; i < size; i++)
cout << left_min[i] << " ";
cout << endl;
int *right_max = new int[size];
right_max[size - 1] = max_value = sum = nums[size - 1];
for (int i = size - 2; i >= 0; i--){
if (sum > 0)
sum += nums[i];
else
sum = nums[i];
if (max_value < sum)
max_value = sum;
right_max[i] = max_value;
}
for (int i = 0; i < size; i++)
cout << right_max[i] << " ";
cout << endl;
int result2 = 0x80000000;
for (int i = 0; i < size - 1; i++){
result2 = (result2 > abs(left_min[i] - right_max[i + 1])) ? result2 : abs(left_min[i] - right_max[i + 1]);
}
cout << result2 << endl;
delete[] left_min;
delete[] right_max;
return max(result1, result2);
}
};