方法 1:前缀和
思路
这道题要找 nums 数组中和的绝对值最大的任意子数组,子数组的问题,我们可以使用前缀和的思想来做,假设前缀和数组是 s。
- 那么子区间的前缀和绝对值可以这样表示:
|s[j] - s[i]| - 我们不难发现,s[j] 跟 s[i] 相差越大,上式也就越大。
- 因此我们只需要找 s 数组中的最大前缀和跟最小前缀和,然后求差即可:
max(s) - min(s) - 因为存在负数的情况,貌似不好理解,所以可以分两种情况理解,在 s 数组中:
- 如果最大前缀和出现在最小前缀和的右边,那么上式算的是最大子数组和。
- 如果最大前缀和出现在最小前缀和的左边,那么上式算的是最小子数组和的绝对值。
还有一个更好理解的方式,就是想象是在爬山,本质上就是在计算最大的高度差。
拿案例 1 举例:
输入:nums = [1,-3,2,3,-4] 输出:5
代码如下
class Solution {
public int maxAbsoluteSum(int[] nums) {
int n = nums.length;
int s = 0;
int max = 0;
int min = 0;
for (int i = 0; i < n; i++) {
s += nums[i];
// 效率更高的写法
if (max < s) {
max = s;
} else if (s < min) {
min = s;
}
}
max - min;
}
}


