1749.任意子数组和的绝对值的最大值

【LetMeFly】1749.任意子数组和的绝对值的最大值

力扣题目链接:https://leetcode.cn/problems/maximum-absolute-sum-of-any-subarray/

给你一个整数数组 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

方法一:动态规划

首先想数组的最大子数组怎么求

遍历数组,使用一个变量$M$记录以当前元素结尾时的最大子数组。

$M = max(nums[i], M + nums[i])$

可以只选择当前元素,也可以和前面的元素连起来。

接着想子数组的最大和绝对值怎么求

$$\max(abs(subarray)) = max(max(subarray), -min(subarray))$$

最大的和的绝对值 要么等于 最大和 要么等于 最小和的相反数。

  • 时间复杂度$O(len(nums))$
  • 空间复杂度$O(1)$

AC代码

C++

1
2
3
4
5
6
7
8
9
10
11
12
class Solution {
public:
int maxAbsoluteSum(vector<int>& nums) {
int ans = abs(nums[0]), m = nums[0], M = nums[0];
for (int i = 1; i < nums.size(); i++) {
M = max(nums[i], M + nums[i]);
m = min(nums[i], m + nums[i]);
ans = max(ans, max(M, -m));
}
return ans;
}
};

Python

1
2
3
4
5
6
7
8
9
10
# from typing import List

class Solution:
def maxAbsoluteSum(self, nums: List[int]) -> int:
ans, m, M = abs(nums[0]), nums[0], nums[0]
for i in range(1, len(nums)):
M = max(nums[i], M + nums[i])
m = min(nums[i], m + nums[i])
ans = max(ans, M, -m)
return ans

同步发文于CSDN,原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/132158662


1749.任意子数组和的绝对值的最大值
https://blog.letmefly.xyz/2023/08/08/LeetCode 1749.任意子数组和的绝对值的最大值/
作者
Tisfy
发布于
2023年8月8日
许可协议