数组-最大子数组差-中等

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

};



猜你喜欢

转载自blog.csdn.net/qq_18124075/article/details/80515566