LeetCode--053--最大子序和

问题描述:

给定一个整数数组 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

 

posted @ 2018-07-24 11:12  Assange  阅读(212)  评论(0编辑  收藏  举报