Python3 LintCode代码 41. 最大子数组

给定一个整数数组,找到一个具有最大和的子数组,返回其最大和。

样例

给出数组[−2,2,−3,4,−1,2,1,−5,3],符合要求的子数组为[4,−1,2,1],其最大和为6

此题有两种解法,分别为动态规划算法和贪心算法

class Solution:
    """
    @param nums: A list of integers
    @return: A integer indicate the sum of max subarray
    """
    #动态规划算法 时间复杂度高
    def maxSubArray(self, nums):
        # write your code here
        maxSum = -float('inf')
        L1 = []
        for i in range(len(nums)):
            L2 = []
            L2.append(nums[i])
            equal = sum(L2)
            if maxSum < equal:
                maxSum = equal
                L1 = nums[i]
            for j in range(i,len(nums)+1):
                if nums[i:j] != []:
                    equal = sum(nums[i:j])
                if maxSum < equal:
                    maxSum = equal
                    L1 = nums[i:j]
        return maxSum
#依次寻找每一个元素的每种组合,然后与最大值进行比较,这种算法可视为穷举,时间复杂度较高,在此不做过多解释。
#L2的引入是为了解决列表只有一个元素时切片[0:0],sum([0:0])恒为0的问题。

    #贪心法 时间复杂度较低,为O(n)
    def maxSubArray1(self,nums):
        MaxSum = sum(nums)
        CurSum = 0
        for i in range(len(nums)):
            CurSum += nums[i]
            #从下标为i的元素开始求和,如果大于MaxSum则替换
            if CurSum > MaxSum:
                MaxSum = CurSum
            #如果前面的和小于0,那么加上下一个数一定大于此时的CurSum,所以舍弃此时的CurSum重新开始求和
            if CurSum < 0:
                CurSum = 0
        return MaxSum
test = Solution()
L = [-2,2,-3,4,-1,2,1,-5,3]
print(test.maxSubArray1(L))
print(test.maxSubArray1([-1]))



猜你喜欢

转载自blog.csdn.net/kevin_pei/article/details/79982273