题目描述:

方法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;
    }
};