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)
相关文章
相关标签/搜索