题:
思路:
我一开始的思路是基于贪心,想着如果加上一个数以后还不如从这个数本身开始,那就从这个数开始,但是这样的思想是错误的,因为你没办法保证当前子数组不是因为有从正数变成负数或者从负数变成正数而导致max发生变化了。
于是看了答案
答案思路:
当我们有了前缀和数组 sum 之后,需要求任意一段子数组 [i,j] 的和
可以直接通过 sum[j] - sum[i - 1] 得出。
现在 通过sum可以求得所有的子数组和的情况
那么使得sum[j]最大,sum[i-1]最小,即为答案(sum[j]为正,sum[i-1]为负数)
如果最大的前缀和数组为负数,则答案应该为Math.abs(前缀和最小)
如果最小的前缀和数组为正数,则答案应该为前缀和最大
代码:
public int maxAbsoluteSum(int[] nums) {
int sum[] = new int[nums.length];
for (int i = 0; i < sum.length; i++) {
if (i == 0) sum[i] = nums[i];
else {
sum[i] = sum[i - 1] + nums[i];
}
}
Arrays.sort(sum);
if (sum[0] > 0) return sum[sum.length - 1];
if (sum[sum.length - 1] < 0) return Math.abs(sum[0]);
return sum[sum.length - 1] - sum[0];
}