5658. 任意子数组和的绝对值的最大值
给你一个整数数组 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:
1 | 输入:nums = [1,-3,2,3,-4] |
示例 2:
1 | 输入:nums = [2,-5,1,-4,3,-2] |
提示:
1 <= nums.length <= 105
-104 <= nums[i] <= 104
前缀和+峰值求解
求连续子数组的和的绝对值的最大值是求连续子数组的最小和与连续子数组的最大和的绝对值谁更大
思路:
- 找前缀和的峰值,最大值的$index$,这个index一定是子数组最大和的开始或者终止的端点的$index$
- 根据找到的这个端点,枚举另外一个端点,并记录子数组的最大和
- 找前缀和的峰值,最小的$index$,这个$index$一定是子数组最大和的开始或者终止的端点的$index$
- 根据找到的这个端点,枚举另外一个端点,并记录子数组的最小和
- 比较最大和与最小和的绝对值的大小,返回较大的那个
1 |
|
前缀和(优雅写法)
1 | class Solution { |
贪心
任意区间和绝对值最大值 等价于 求前缀和任意两点差的最大值 即 最大值 与 最小值 的差
1 |
|