1749. 任意子数组和的绝对值的最大值
来源第 45 场双周赛 Q2难度中等分数1541
题目描述
给你一个整数数组 nums 。一个子数组 [numsl, numsl+1, ..., numsr-1, numsr] 的 和的绝对值 为 abs(numsl + numsl+1 + ... + numsr-1 + numsr) 。
请你找出 nums 中 和的绝对值 最大的任意子数组(可能为空),并返回该 最大值 。
abs(x) 定义如下:
- 如果
x是负整数,那么abs(x) = -x。 - 如果
x是非负整数,那么abs(x) = x。
示例 1:
输入:nums = [1,-3,2,3,-4] 输出:5 解释:子数组 [2,3] 和的绝对值最大,为 abs(2+3) = abs(5) = 5 。
示例 2:
输入:nums = [2,-5,1,-4,3,-2] 输出:8 解释:子数组 [-5,1,-4] 和的绝对值最大,为 abs(-5+1-4) = abs(-8) = 8 。
提示:
1 <= nums.length <= 105-104 <= nums[i] <= 104
解法
方法一:动态规划
思考
子数组和的绝对值最大,等于最大子段和与最小子段和绝对值之中的较大者。
Kadane 同时维护以当前位置结尾的最大和 \(f\) 与最小和 \(g\),答案取 \(f\) 与 \(|g|\) 的全程最大。
我们定义 \(f[i]\) 表示以 \(nums[i]\) 结尾的子数组的和的最大值,定义 \(g[i]\) 表示以 \(nums[i]\) 结尾的子数组的和的最小值。那么 \(f[i]\) 和 \(g[i]\) 的状态转移方程如下:
\[ \begin{aligned} f[i] &= \max(f[i - 1], 0) + nums[i] \\ g[i] &= \min(g[i - 1], 0) + nums[i] \end{aligned} \]
最后答案为 \(max(f[i], |g[i]|)\) 的最大值。
由于 \(f[i]\) 和 \(g[i]\) 只与 \(f[i - 1]\) 和 \(g[i - 1]\) 有关,因此我们可以使用两个变量代替数组,将空间复杂度降低到 \(O(1)\)。
时间复杂度 \(O(n)\),空间复杂度 \(O(1)\)。其中 \(n\) 为数组 \(nums\) 的长度。
1 2 3 4 5 6 7 8 9 | |
1 2 3 4 5 6 7 8 9 10 11 12 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |
1 2 3 4 5 6 7 8 9 10 11 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 | |