选题-LeetCode 33:
给定一个整数数组 nums
,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
解题思路:
1. 采用分而治之的算法,递归地求解其最大和
2. 在每一次递归开始时,先检查边界条件:若越界,则返回0;若区间只有一个值,则返回相应的值
3. 若区间中的数的个数大于1个:
1)将区间二等分,分别递归计算在左、右两个子区间中的连续子数组的最大和;
2)计算横跨两个子区间的连续数组的最大和,从中间分别向左右扩展进行查找,先找出在左区间中包含区间中点的最大连续子数组的和(因为必须包括中点值,所以只能从中点向起点延伸),再找出在右区间中包含区间中点下一个数的最大连续子数组的和,将二者加起来即结果值
3)返回上述计算中的三个值的最大值
代码:
"""
:type nums: List[int]
:rtype: int
"""
class Solution:
def maxSubArray(self, nums):
length=len(nums)
return self.maxSub_recur(nums,0,length-1)
def maxSub_recur(self,nums,begin,end):
if(end<begin):
return 0
if(begin==end):
return nums[begin]
temp=(begin+end)//2
value=list([0,0,0])
value[0]=self.maxSub_recur(nums,begin,temp)
value[1]=self.maxSub_recur(nums,temp+1,end)
value[2]=self.find_middle_value(nums,begin,end)
return max(value)
def find_middle_value(self,nums,begin,end):
temp=(begin+end)//2
if(temp < begin or temp+1 > end):
return 0
else:
left_temp=nums[temp]
right_temp=nums[temp+1]
left_max=left_temp
right_max=right_temp
left_index=temp-1
right_index=temp+2
while(left_index>=begin+1 and right_index <= end):
left_temp=left_temp+nums[left_index]
right_temp=right_temp+nums[right_index]
if(left_temp>left_max):
left_max=left_temp
if(right_temp>right_max):
right_max=right_temp
right_index=right_index+1
left_index=left_index-1
while(left_index>=begin):
left_temp=left_temp+nums[left_index]
if(left_temp>left_max):
left_max=left_temp
left_index=left_index-1
while(right_index <= end):
right_temp=right_temp+nums[right_index]
if(right_temp>right_max):
right_max=right_temp
right_index=right_index+1
return left_max+right_max