描述
給定一個整數數組,找出兩個不重疊的子數組A和B,使兩個子數組和的差的絕對值|SUM(A) - SUM(B)|最大。
返回這個最大的差值。
子數組最少包含一個數
樣例
給出數組[1, 2, -3, 1],返回 6
挑戰
時間複雜度爲O(n),空間複雜度爲O(n)
思路
構建相應的數組ForMax[i]表示從nums[0]到nums[i]的子數組和的最大值,ForMin[i]表示從nums[0]到nums[i]的子數組和的最小值,RevMax[i]表示從nums[i]到nums[len-1]的子數組和的最大值,RevMin[i]表示從nums[i]到nums[len-1]的子數組和的最小值。最終的結果取ForMax[i] - RevMin[i + 1]與RevMax[j] - ForMin[j - 1]的最大值
#ifndef C45_H
#define C45_H
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
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.empty())
return 0;
int len = nums.size();
//ForMax[i]表示從nums[0]到nums[i]的子數組和的最大值
//ForMin[i]表示從nums[0]到nums[i]的子數組和的最小值
//RevMax[i]表示從nums[i]到nums[len-1]的子數組和的最大值
//RevMin[i]表示從nums[i]到nums[len-1]的子數組和的最小值
vector<int> ForMax(len), ForMin(len), RevMax(len), RevMin(len);
ForMax[0] = nums[0];
ForMin[0] = nums[0];
RevMax[len - 1] = nums[len - 1];
RevMin[len - 1] = nums[len - 1];
int res = INT_MIN;
int Max = nums[0], Min = nums[0];
int curMax = nums[0], curMin = nums[0];
for (int i = 1; i < len; ++i)
{
if (curMax>0)
curMax += nums[i];
else
curMax = nums[i];
if (curMax > Max)
Max = curMax;
ForMax[i] = Max;
if (curMin < 0)
curMin += nums[i];
else
curMin = nums[i];
if (curMin < Min)
Min = curMin;
ForMin[i] = Min;
}
Max = nums.back(), Min = nums.back();
curMax = Max, curMin = Min;
for (int i = len - 2; i >= 0; --i)
{
if (curMax>0)
curMax += nums[i];
else
curMax = nums[i];
if (curMax > Max)
Max = curMax;
RevMax[i] = Max;
if (curMin < 0)
curMin += nums[i];
else
curMin = nums[i];
if (curMin < Min)
Min = curMin;
RevMin[i] = Min;
}
//計算ForMax[i] - RevMin[i + 1]
for (int i = 0; i < len - 1; ++i)
{
res = max(res, ForMax[i] - RevMin[i + 1]);
}
//計算RevMax[i] - ForMin[i - 1]
for (int i = len - 1; i > 0; --i)
{
res = max(res, RevMax[i] - ForMin[i - 1]);
}
return res;
}
};
#endif