题目描述:
方法1:动态规划,分别求最大子数组和和最小子数组和,他们的绝对值中最大的一个即为题目要求
class Solution {
public:
int maxAbsoluteSum(vector<int>& nums) {
int p = max(0,nums[0]);//保存nums[i]结尾最大子数组和
int q = min(0,nums[0]);//保存nums[i]结尾最小子数组和
int MAX = p;
int MIN = q;
for(int i=1;i<nums.size();i++){
p = max(p+nums[i],nums[i]);
q = min(q+nums[i],nums[i]);
MAX = max(MAX,p);
MIN = min(MIN,q);
}
return max(abs(MAX),abs(MIN));
}
};
方法二:前缀和,取前缀和中的最大值与最小值,它俩的差就是答案(不用考虑谁在前谁在后,最大子数组和还需要考虑前后)
class Solution {
public:
int maxAbsoluteSum(vector<int>& nums) {
int pre_sum = nums[0];
int min_presum = min(0,pre_sum);
int max_presum = max(0,pre_sum);
for(int i=1;i<nums.size();i++){
pre_sum += nums[i];
max_presum = max(max_presum,pre_sum);
min_presum = min(min_presum,pre_sum);
}
return max_presum - min_presum;
}
};