918. Maximum Sum Circular Subarray

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

先看Leetcode 53 Maximum Subarray

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        currSum = 0
        maxSum = float("-inf")
        for num in nums:
            currSum = max(currSum+num, num)
            maxSum = max(maxSum, currSum)
        return maxSum

这道题只需要讨论两个情况:

(1) max subarray

(2) total - min subarray

唯一的corner case,当所有数是负数时,最后结果max subarray是array里面的最大值

class Solution:
    def maxSubarraySumCircular(self, A: List[int]) -> int:
        currMax = 0
        maxSum = float("-inf")
        currMin = 0
        minSum = float("inf")
        total = 0
        
        for num in A:
            currMax = max(num,num+currMax)
            maxSum = max(maxSum,currMax)
            currMin = min(num,num + currMin)
            minSum = min(currMin,minSum)
            total += num
        if minSum == total:
            return maxSum
        return max(maxSum, total- minSum)

Last updated

Was this helpful?