天天看點

leetcode 918. 環形子數組的最大和

給定一個由整數數組 A 表示的環形數組 C,求 C 的非空子數組的最大可能和。

在此處,環形數組意味着數組的末端将會與開頭相連呈環狀。(形式上,當0 <= i < A.length 時 C[i] = A[i],而當 i >= 0 時 C[i+A.length] = C[i])

此外,子數組最多隻能包含固定緩沖區 A 中的每個元素一次。(形式上,對于子數組 C[i], C[i+1], …, C[j],不存在 i <= k1, k2 <= j 其中 k1 % A.length = k2 % A.length)

示例 1:

輸入:[1,-2,3,-2]

輸出:3

解釋:從子數組 [3] 得到最大和 3

示例 2:

輸入:[5,-3,5]

輸出:10

解釋:從子數組 [5,5] 得到最大和 5 + 5 = 10

示例 3:

輸入:[3,-1,2,-1]

輸出:4

解釋:從子數組 [2,-1,3] 得到最大和 2 + (-1) + 3 = 4

示例 4:

輸入:[3,-2,2,-3]

輸出:3

解釋:從子數組 [3] 和 [3,-2,2] 都可以得到最大和 3

示例 5:

輸入:[-2,-3,-1]

輸出:-1

解釋:從子數組 [-1] 得到最大和 -1

提示:

-30000 <= A[i] <= 30000

1 <= A.length <= 30000

來源:力扣(LeetCode)

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

著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。

分析:設整個數組的和為sum, 連續子數組的最大和為maxSum, 最小和為minSum, 那最終的結果res=max(maxSum, sum-minSum), sum-minSum表示那種中間最小,首尾各一段加起來和最大的情況。

class Solution(object):
    def maxSubarraySumCircular(self, A):
        """
        :type A: List[int]
        :rtype: int
        """
        res=A[0]
        minRes=A[0]
        curMax=A[0]        #表示到目前位置為止的連續最大和
        curMin=A[0]        #表示到目前位置為止的連續最小和
        sum=A[0]
        for i in range(1,len(A)):
            if curMax>=0:
                curMax+=A[i]
            else:
                curMax=A[i]
            if curMin<0:
                curMin+=A[i]
            else:
                curMin=A[i]
            sum+=A[i]
            if curMax>res:
                res=curMax
            if curMin<minRes:
                minRes=curMin
        if res<sum-minRes and sum-minRes>0:
            res=sum-minRes
        return res