Skip to content

Latest commit

 

History

History
78 lines (59 loc) · 3.24 KB

File metadata and controls

78 lines (59 loc) · 3.24 KB

918. Maximum Sum Circular Subarray (Medium)

Date and Time: Jan 22, 2025, 22:34 (EST)

Link: https://leetcode.com/problems/maximum-sum-circular-subarray


Question:

Given a circular integer array nums of length n, return the maximum possible sum of a non-empty subarray of nums.

A circular array means the end of the array connects to the beginning of the array. Formally, the next element of nums[i] is nums[(i + 1) % n] and the previous element of nums[i] is nums[(i - 1 + n) % n].

A subarray may only include each element of the fixed buffer nums at most once. Formally, for a subarray nums[i], nums[i + 1], ..., nums[j], there does not exist i <= k1, k2 <= j with k1 % n == k2 % n.


Example 1:

Input: nums = [1,-2,3,-2]

Output: 3

Explanation: Subarray [3] has maximum sum 3.

Example 2:

Input: nums = [5,-3,5]

Output: 10

Explanation: Subarray [5,5] has maximum sum 5 + 5 = 10.

Example 3:

Input: nums = [-3,-2,-3]

Output: -2

Explanation: Subarray [-2] has maximum sum -2.


Constraints:

  • n == nums.length

  • 1 <= n <= 3 * 10^4

  • -3 * 10^4 <= nums[i] <= 3 * 10^4


Walk-through:

Find solution from circular and non-circular situations, then return the max(max_subarray, total - min_subarray)


Python Solution:

class Solution:
    def maxSubarraySumCircular(self, nums: List[int]) -> int:
        # S: Find solution from circular and non-circular situations, then return the max(max_subarray, total - min_subarray)
        # max_subarray from non-circular, min_subarray from circular array
        # Handle edge case, if all nums are negative number, return the max from nums
        curMax = curMin = globalMin = globalMax = total = 0
        if max(nums) < 0:
            return max(nums)
        for n in nums:
            curMin = min(n, curMin + n)
            globalMin = min(curMin, globalMin)
            curMax = max(n, curMax + n)
            globalMax = max(curMax, globalMax)
            total += n
        # Return the max from non-circular array or total - globalMin from circular array
        return max(globalMax, total - globalMin)

Time Complexity: $O(n)$
Space Complexity: $O(1)$


CC BY-NC-SABY: credit must be given to the creatorNC: Only noncommercial uses of the work are permittedSA: Adaptations must be shared under the same terms