思路:數組
#定義五個值,分別是臨時的最大子串和,臨時的最小子串和,全局的最小子串和,全局的最大子串和和數組全部元素之和 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)