Leetcode918. 環形子數組的最大和 Python實現

  • 題目要求:

image.png

  • 思路:數組

    • 題中給的雖然是環形的,一開始想到的必定是遍歷從頭到尾再遍歷一遍
    • 這道題遍歷一遍,找到全部元素的和sum,最大的子序和,和最小的子序和
    • 若是sum小於0並且等於最小的子序和,說明數組元素都爲負,返回最大子序和
    • 若是不是上述狀況,經過比較,若是sum-最小的子序和>最大的子序和,說明最大的子序和在數組的首尾都有,那麼返回sum-最小的子序和,反之返回最大子序和
  • 核心代碼:
#定義五個值,分別是臨時的最大子串和,臨時的最小子串和,全局的最小子串和,全局的最大子串和和數組全部元素之和
localmax = A[0]
localmin = A[0]
finalmin = A[0]
finalmax = A[0]
summ = A[0]
#由於五個值的初始值都賦爲A[0],因此遍歷從下標1開始
for i in range(1,len(A)):
    #總和加上當前的值
    summ += A[i]
    #若是當前的值加上臨時的最大子串和比當前的值大,把當前的值加上臨時的最大子串和賦給臨時的最大子串和
    if localmax + A[i] > A[i]:
        localmax += A[i]
    #若是沒有當前的值大,說明當前的值是臨時的最大子串和
    else:
        localmax = A[i]
    #把當前最大子串和和全局最大子串和中較大的那個賦給全局最大子串和
    finalmax = max(localmax , finalmax)
    #最小子串和也是同樣的
    if localmin + A[i] < A[i]:
        localmin += A[i]
    else:
        localmin = A[i]
    finalmin = min(localmin , finalmin)
#若是全部元素的和等於全局的最小子串和,說明數組中全部的元素都爲負,那麼返回最大子串和,就是全部負數中最大的那個
if summ == finalmin:
    return finalmax
#若是不是,返回數組元素的和減去全局最小子串的值,獲得的值要麼是和全局最大子串和相等,也就是沒有出現最大子串和包含數組的開頭和結尾處的元素的狀況,或是獲得的值大於全局最大子串和,也就是出現了最大子串和包含數組的開頭和結尾處的元素的狀況
#還有一種狀況是,數組中全部的元素都爲正,因此這時候全局最小子串的值爲數組中值最小的正數,那麼summ減去全局最小子串必定小於全局最大子串(也就是數組全部元素的和),則返回全局最大子串
return max(summ - finalmin,finalmax)
  • 完整代碼:

加上判斷給定的數組是否爲空的狀況,若是爲空,返回空spa

class Solution(object):
    def maxSubarraySumCircular(self, A):
        """
        :type A: List[int]
        :rtype: int
        """
        if len(A) == 0:
            return None
        localmax = A[0]
        localmin = A[0]
        finalmin = A[0]
        finalmax = A[0]
        summ = A[0]
        for i in range(1,len(A)):
            summ += A[i]
            if localmax + A[i] > A[i]:
                localmax += A[i]
            else:
                localmax = A[i]
            finalmax = max(localmax , finalmax)

            if localmin + A[i] < A[i]:
                localmin += A[i]
            else:
                localmin = A[i]
            finalmin = min(localmin , finalmin)
        if summ == finalmin:
            return finalmax

        return max(summ - finalmin,finalmax)
相關文章
相關標籤/搜索