题目描述
题意解析
在给定的数组中,选取一段连续的子数组,要求这段连续子数组的绝对值为最大,求最大值。
思路分析
如果想要快速的算出一个数组中连续区间的和,使用前缀和是很好的选择,我们求出数组的前缀和数组之后,能在O(1)的时间复杂度内算出一段连续区间的和。所以如果我们是求取和的最大值,那么是不是只需要使用前缀和数组中的最大减去最小就可以了? 我们可以分情况看一下:
- max > 0, min > 0, ans = max - 0
- max > 0, min < 0, ans = max - min
- max < 0, min < 0, ans = 0 - min
如果数组中元素都为正或者都为负,这两种情况是最简单的,只需要全加起来求和算绝对值就行了,而剩下的一种情况就是max - min了,所以这种思路是可行。我们可以将max和min初始化时均设置为0,这样就不用去判断条件,直接返回结果就可以。
代码
class Solution {
public int maxAbsoluteSum(int[] nums) {
int minx = 0;
int maxx = 0;
int sum = 0;
for(int i=0;i<nums.length;i++){
sum += nums[i];
if(sum > maxx) maxx = sum;
if(sum < minx) minx = sum;
}
return maxx - minx;
}
}