给定一个整数数组,找出两个不重叠的子数组A和B,使两个子数组和的差的绝对值|SUM(A) - SUM(B)|最大。 返回这个最大的差值。 注意事项 子数组最少包含一个数 样例 给出数组[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; } };