[LeetCode] 1749. Maximum Absolute Sum of Any Subarray

Problem

https://leetcode.com/problems/maximum-absolute-sum-of-any-subarray/description/

Leetcode - Maximum Absolute Sum of Any Subarray

Type - Prefix Sum, Greedy

Difficulty - Medium

Approach & Solution

Within the limit of prefix sum range [0, i],

If the answer is positive, we have to subtract maximum negative prefix if exists.

  • It would be maximum prefix sum - minimum prefix sum.

If the answer is negative, we have to subtract maximum positive prefix if exists.

  • It would be abs(minimum prefix sum - maximum prefix sum) = maximum prefix sum - minimum prefix sum.

So, the maximum subarray would be (maximum prefix sum - minimum prefix sum) of range [0, i]

variables:

  • pref: prefix sum of range [0, i] (0 <= i < n)

  • maxSum: maximum prefix sum within range [0, j] (0 <= j <= i)

  • minSum: minimum prefix sum within range [0, k] (0 <= k <= i)

While iterating array,

  1. update prefix sum(pref += nums[i])

  2. update maximum prefix sum

  3. update minimum prefix sum

Finally, return maxSum - minSum.

Complexity

Time Complexity: O(n) - Iterating through the array Once.

Space Complexity: O(1) - No extra data strtuctures are used.

Code (C++ | Go)

class Solution {
public:
    int maxAbsoluteSum(vector<int>& nums) {
        int maxSum = 0;
        int minSum = 0;
        int pref = 0;

        for(int num : nums) {
            pref += num;
            maxSum = max(maxSum, pref);
            minSum = min(minSum, pref);
        }

        return maxSum - minSum;
    }
};
func maxAbsoluteSum(nums []int) int {
    maxSum, minSum, pref := 0, 0, 0

    for _, num := range nums {
        pref += num
        maxSum = max(maxSum, pref);
        minSum = min(minSum, pref);
    }   

    return maxSum - minSum
}