题目大意:求出一个序列的最大子序和,顾名思义,就是一段最大的连续序列的和
题目分析:本题可以用两种解法求解,动态规划或分治法
法一:动态规划,用result[i]保存以数字nums[i]结尾的最大子序和,然后不断更新result数组的最大值即可。总的时间复杂度O(n)
代码展示:
class Solution(object):
def maxSubArray(self, nums):
result = nums[:]
maxSum = nums[0]
for i in range(1,len(nums)):
if result[i-1]>0:
result[i] = nums[i] + result[i-1]
if result[i]>maxSum:
maxSum = result[i]
return maxSum
法二:分治法,最大子序和要么在左半部分,要么在右半部分,要么就横跨两部分(即包括左半部分的最后一个元素,和右半部分的第一个元素)。返回这三种情况的最大值即可。第三种情况,其中包括左半部分最后一个元素的情形,需要挨个往前遍历,更新最大值。包含右半部分的第一个元素的情况类似。总的时间复杂度O(nlogn)
代码展示:
class Solution(object):
def maxSubArray(self, nums):
left = 0
right = len(nums)-1
maxSum = self.divide(nums,left,right)
return maxSum
def divide(self,nums,left,right):
if left==right:
return nums[left]
center = (left+right)/2
leftMaxSum = self.divide(nums,left,center)
rightMaxSum = self.divide(nums,center+1,right)
leftBorderSum = nums[center]
leftSum = nums[center]
for i in range(center-1,left-1,-1):
leftSum += nums[i]
if leftSum>leftBorderSum:
leftBorderSum = leftSum
rightBorderSum = nums[center+1]
rightSum = nums[center+1]
for i in range(center+2,right+1):
rightSum += nums[i]
if rightSum>rightBorderSum:
rightBorderSum = rightSum
BorderSum = leftBorderSum + rightBorderSum
return max(leftMaxSum,rightMaxSum,BorderSum)