本文主要是介绍每日随机一题 leetcode1749. 任意子数组和的绝对值的最大值,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题:
思路:
我一开始的思路是基于贪心,想着如果加上一个数以后还不如从这个数本身开始,那就从这个数开始,但是这样的思想是错误的,因为你没办法保证当前子数组不是因为有从正数变成负数或者从负数变成正数而导致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];}
这篇关于每日随机一题 leetcode1749. 任意子数组和的绝对值的最大值的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!