目录
1749. 任意子数组和的绝对值的最大值
题目描述:
实现代码与解析:
动态规划 + 分类讨论
原理思路:
前缀和
原理思路:
1749. 任意子数组和的绝对值的最大值
题目描述:
给你一个整数数组 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
实现代码与解析:
动态规划 + 分类讨论
class Solution {
public:
int maxAbsoluteSum(vector<int>& nums) {
vector<int> f(nums.size(), 0); // 以下标 i 结尾的子数组最大值
vector<int> f2(nums.size(), 0x3f3f3f3f); // 以下标i 结尾的子数组最小值
f[0] = nums[0];
f2[0] = nums[0];
for (int i = 1; i < nums.size(); i++)
{
f[i] = max({f[i - 1] + nums[i], nums[i], 0});
f2[i] = min({f2[i - 1] + nums[i], nums[i], 0});
}
int res = 0;
for (int i = 0; i < nums.size(); i++)
{
cout << f[i] << " " << f2[i] << endl;
int m = max(f[i], abs(f2[i]));
res = max(res, m);
}
return res;
}
};
原理思路:
分类讨论,一种是情况是取正数,一种情况是取负数,可以不用数组一样的,简单的dp。
前缀和
class Solution {
public:
int maxAbsoluteSum(vector<int> &nums) {
int s = 0, mx = 0, mn = 0;
for (int i = 0; i < nums.size(); i++)
{
s += nums[i];
mx = max(mx, s);
mn = min(mn, s);
}
return mx - mn;
}
};
原理思路:
最大值减去最小值就是结果,无论最大值在最小值前还是后,在前就是负数来的结果,在后就是正数得来的结果。