1749. 任意子数组和的绝对值的最大值
大约 3 分钟
1749. 任意子数组和的绝对值的最大值
- 标签:数组、动态规划
- 难度:中等
题目链接
题目大意
描述:给定一个整数数组 。
要求:找出 中「和的绝对值」最大的任意子数组(可能为空),并返回最大值。
说明:
子数组 的和的绝对值:。
定义如下:
- 如果 是负整数,那么 。
- 如果 是非负整数,那么 。
。
。
示例:
- 示例 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:动态规划
子数组和的绝对值的最大值,可能来自于「连续子数组的最大和」,也可能来自于「连续子数组的最小和」。
而求解「连续子数组的最大和」,我们可以参考「0053. 最大子数组和」的做法,使用一个变量 来表示以第 个数结尾的连续子数组的最大和。使用另一个变量 来表示以第 个数结尾的连续子数组的最小和。然后取两者绝对值的最大值为答案 。
具体步骤如下:
- 遍历数组 ,对于当前元素 :
- 如果 ,则「第 个数结尾的连续子数组的最大和」+「第 个数的值」<「第 个数的值」,所以 应取「第 个数的值」,即:。
- 如果 ,则「第 个数结尾的连续子数组的最大和」 +「第 个数的值」 >= 第 个数的值,所以 应取「第 个数结尾的连续子数组的最大和」 +「第 个数的值」,即:。
- 如果 ,则「第 个数结尾的连续子数组的最大和」+「第 个数的值」>「第 个数的值」,所以 应取「第 个数的值」,即:。
- 如果 ,则「第 个数结尾的连续子数组的最大和」 +「第 个数的值」 <= 第 个数的值,所以 应取「第 个数结尾的连续子数组的最大和」 +「第 个数的值」,即:。
- 维护答案 ,将 和 绝对值的最大值与 进行比较,并更新 。
- 遍历完返回答案 。
思路 1:代码
class Solution:
def maxAbsoluteSum(self, nums: List[int]) -> int:
ans = 0
mmax, mmin = 0, 0
for num in nums:
mmax = max(mmax, 0) + num
mmin = min(mmin, 0) + num
ans = max(ans, mmax, -mmin)
return ans
思路 1:复杂度分析
- 时间复杂度:。
- 空间复杂度:。