文章目录
- Maximum Absolute Sum of Any Subarray 任意子数组和的绝对值的最大值
- 问题描述:
- 分析
- 代码
- 动态规划
- Tag
Maximum Absolute Sum of Any Subarray 任意子数组和的绝对值的最大值
问题描述:
给你一个整数数组 nums 。一个子数组 [ n u m s l , n u m s l + 1 , . . . , n u m s r − 1 , n u m s r ] [nums_l, nums_{l+1}, ..., nums_{r-1}, nums_{r}] [numsl,numsl+1,...,numsr−1,numsr] 的 和的绝对值 为 a b s ( n u m s l + n u m s l + 1 + . . . + n u m s r − 1 + n u m s r ) abs(nums_l + nums_{l+1} + ... + nums_{r-1} + nums_{r}) abs(numsl+numsl+1+...+numsr−1+numsr) 。
请你找出 n u m s nums nums 中 和的绝对值 最大的任意子数组(可能为空),并返回该 最大值 。
abs(x) 定义如下:
如果 x 是负整数,那么 a b s ( x ) = − x abs(x) = -x abs(x)=−x 。
如果 x 是非负整数,那么 a b s ( x ) = x abs(x) = x abs(x)=x 。
1 < = n u m s . l e n g t h < = 1 0 5 − 1 0 4 < = n u m s [ i ] < = 1 0 4 1 <= nums.length <= 10^5\\ -10^4 <= nums[i] <= 10^4 1<=nums.length<=105−104<=nums[i]<=104
分析
除了暴力枚举,前缀和计算。
还有一个专门用来处理子数组最大和的算法Kadane's Algorithm
。它可以在线性的时间复杂度下,计算出子数组的最大和。具体的理论可以google,bing。
代码
动态规划
public int maxAbsoluteSum(int[] nums) {int ans = 0, fMax = 0, fMin = 0;for (int x : nums) {fMax = Math.max(fMax, 0) + x;fMin = Math.min(fMin, 0) + x;ans = Math.max(ans, Math.max(fMax, -fMin));}return ans;}
时间复杂度 O ( N ) O(N) O(N)
空间复杂度 O ( 1 ) O(1) O(1)
Tag
Array
Dynamic Programming