给定一个整数数组,找到一个具有最大和的子数组,返回其最大和。
样例
给出数组[−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]))