1. 题目描述
1749 任意子数组和的子数组的最大值
2. 解题思路
- 动态规划的思想
常规思路,维护一个最大子数组和与最小子数组和,其中全局最大值等于max({glo_max, cur_max, -cur_min})
。 - 前缀和的思想
维护当前最小前缀和与当前最大前缀和,最终结果等于最大前缀和与最小前缀和的差值。
该思想同样可以应用到 53 最大子数组和 这道题目中。
3. 代码实现(动态规划)
class Solution {
public:
int maxAbsoluteSum(vector<int>& nums) {
int glo_max = nums[0];
int cur_max = 0;
int cur_min = 0;
for (auto num : nums) {
cur_max = max(cur_max, 0) + num;
cur_min = min(cur_min, 0) + num;
glo_max = max({glo_max, cur_max, -cur_min});
}
return glo_max;
}
};
4. 代码实现(前缀和)
class Solution {
public:
int maxAbsoluteSum(vector<int>& nums) {
int pre_sum = 0;
int mx = 0;
int mn = 0;
for (auto num : nums) {
pre_sum += num;
mx = max(mx, pre_sum);
mn = min(mn, pre_sum);
}
return mx - mn;
}
};