第九周第二次作业

选题-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

    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值