给定一个整数数组,找出两个不重叠的子数组A和B,使两个子数组和的差的绝对值|SUM(A) - SUM(B)|最大。
返回这个最大的差值。
注意事项
子数组最少包含一个数
您在真实的面试中是否遇到过这个题?
Yes
样例
给出数组[1, 2, -3, 1],返回 6
挑战
时间复杂度为O(n),空间复杂度为O(n)
标签
贪心 枚举法 LintCode 版权所有 数组 子数组 前后遍历
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) {
// write your code here
if(nums.empty())
return 0;
int max,min,suma,sumi;
int n=nums.size();
int lefta[n],righti[n];
int lefti[n],righta[n];
lefti[0]=lefta[0]=max=min=suma=sumi=nums[0];
for(int i=1;i<n;i++){
if(suma<=0)
suma=nums[i];
else
suma+=nums[i];
if(max<suma)
max=suma;
lefta[i]=max;
if(sumi>=0)
sumi=nums[i];
else
sumi+=nums[i];
if(min>sumi)
min=sumi;
lefti[i]=min;
// cout<<max<<" "
}
// cout<<endl;
righta[n-1]=righti[n-1]=min=max=sumi=suma=nums[n-1];
for(int i=n-2;i>=0;i--){
if(suma<=0)
suma=nums[i];
else
suma+=nums[i];
if(max<suma)
max=suma;
righta[i]=max;
if(sumi>=0)
sumi=nums[i];
else
sumi+=nums[i];
if(min>sumi)
min=sumi;
righti[i]=min;
// cout<<min<<" "
}
// cout<<endl;
max=abs(lefta[0]-righti[1]);
for(int i=1;i<n-1;i++){
if(abs(lefta[i]-righti[i+1])>max)
max=abs(lefta[i]-righti[i+1]);
if(abs(lefti[i]-righta[i+1])>max)
max=abs(lefti[i]-righta[i+1]);
}
return max;
}
};