采用前缀和维护数组,题目中子数组为连续的子序列,即求连续子序列中和的绝对值的最大值:
result = 子序列中正数和 - 子序列中负数和
因此,要求result,只需要求子序列的最大正数和减去最小负数和。
定义sum变量表示前缀和,则数组nums的前缀和为:
sum = nums[0]+nums[1]+nums[2]+...+nums[n];
定义max变量表示前缀和中的最大前缀和:
max = nums[0]+nums[1]+nums[2]+...+nums[j];
定义min变量表示前缀和中的最小前缀和:
min = nums[0]+nums[1]+nums[2]+...+nums[i];
则可知,数组中子数组和的绝对值最大值为:
result = max-min = nums[i+1]+nums[i+2]+... +nums[j] (当j>i时);
result = max-min = -nums[j+1]-nums[j+2]-... -nums[i] (当i>j时,此时可理解为全为负数);
Java代码如下:
class Solution {
public int maxAbsoluteSum(int[] nums) {
//判断是否为空
if(nums.length==0) return 0;
int max = 0,min = 0,count = 0;
for(int num:nums){
count+=num;
max = Math.max(max,count);
min = Math.min(min,count);
}
return max-min;
}
}