思路:数组
#定义五个值,分别是临时的最大子串和,临时的最小子串和,全局的最小子串和,全局的最大子串和和数组全部元素之和 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)