Maximum Subarray Difference

Description:

Given an array with integers.

Find two non-overlapping subarrays A and B, which |SUM(A) - SUM(B)| is the largest.

Return the largest difference.

Example

For [1, 2, -3, 1], return 6

Note

The subarray should contain at least one number

Solution:

( 不难证明这两个子数组必然是紧邻的 )

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) {
		auto sz = (int)nums.size();
		if (sz == 0) return 0;
		vector<int> minl(sz, nums[0]);
		vector<int> maxl(sz, nums[0]);
		vector<int> minr(sz, nums[sz-1]);
		vector<int> maxr(sz, nums[sz-1]);
		for (int i = 1; i < sz; ++i) {
			minl[i] = min(minl[i-1]+nums[i], nums[i]);
			maxl[i] = max(maxl[i-1]+nums[i], nums[i]);
			minr[sz-1-i] = min(minr[sz-i]+nums[sz-1-i], nums[sz-1-i]);
			maxr[sz-1-i] = max(maxr[sz-i]+nums[sz-1-i], nums[sz-1-i]);
		}
		int rc = 0;
		for (int i = 0; i < sz-1; ++i)
			rc = max(max(rc, maxr[i+1]-minl[i]), maxl[i]-minr[i+1]);
		return rc;
	}
};
posted @ 2015-10-16 03:08  影湛  阅读(159)  评论(0)    收藏  举报