问题描述:
给定一个整数数组 nums
,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
时间超限: 暴力穷举
1 class Solution(object): 2 def maxSubArray(self, nums): 3 """ 4 :type nums: List[int] 5 :rtype: int 6 """ 7 8 max = nums[0] 9 if len(nums) == 1: 10 return nums[0] 11 res = 0 12 for step in range(len(nums)):#step 控制连续加的个数 13 for i in range(len(nums)-step):#i控制从第几个开始加 14 for j in range(step+1): 15 res += nums[i] 16 i += 1 17 if res > max: 18 max = res 19 res = 0 20 return max
方法1:当前值的大小与前面的值之和比较,若当前值更大,则取当前值,舍弃前面的值之和
1 class Solution(object): 2 def maxSubArray(self, nums): 3 """ 4 :type nums: List[int] 5 :rtype: int 6 """ 7 if len(nums) == 0: 8 return 0 9 preSum = maxSum = nums[0] 10 for i in xrange(1, len(nums)): 11 preSum = max(preSum + nums[i], nums[i]) 12 maxSum = max(maxSum, preSum) 13 return maxSum
方法2:(分治法)对半分,求左边最大,右边最大,以及边界最大 ,返回最大值
1 class Solution(object): 2 def maxSubArray(self, nums): 3 """ 4 :type nums: List[int] 5 :rtype: int 6 """ 7 def maxSum(alist, left, right): 8 #递归返回条件 9 if left >= right: 10 return alist[left] #return原值,不是return 0 11 12 middle = (left + right) // 2 #记得打括号,去(TiMe)调了老半天 13 leftMax = maxSum(alist, left, middle) 14 rightMax = maxSum(alist, middle+1, right) 15 16 #求左边界最大值 17 leftBoardSum, leftBoardMax = 0, alist[middle] 18 for i in range(middle, left-1,-1): #左段最右端没有取到middle 19 leftBoardSum += alist[i] 20 if leftBoardSum > leftBoardMax: 21 leftBoardMax = leftBoardSum 22 23 #求右边界最大值 24 rightBoardSum, rightBoardMax = 0, alist[middle+1] 25 for j in range(middle+1, right+1): #右段最右端取到了right 26 rightBoardSum += alist[j] 27 if rightBoardSum > rightBoardMax: 28 rightBoardMax = rightBoardSum 29 30 #边界最大值 31 boardMax = leftBoardMax + rightBoardMax 32 33 return max(leftMax, rightMax, boardMax) 34 35 36 if nums == []: 37 return 0 38 39 left = 0 40 right = len(nums)-1 41 res = maxSum(nums, left, right) #left,right为左右下标 42 return res
2018-07-24 11:11:59