描述
给定一个整数数组,找出两个不重叠的子数组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); } };