【hot100篇-python刷题记录】【最大子数组和】

R5-普通数组

印象题,讲思路:

1.0个元素,返回0

2.将从left到right的计算简化为为left-mid,mid+1-right 以及left-mid-right 3者的最大值(因为有负数)

3.上面左右两边的计算可以递归调用本身函数,left-mid-right的计算另起函数

4.cross函数中,计算跨过mid元素的数组的最大值,就可以从mid元素像左右两边扩展,由于可能出现一边倒的情况(左边/右边为0),则左右两边分别计算最大值,最后s1+mid+s2即可。

tips:

当数组只有一个元素,这一条件需要放在递归计算那个函数,因为这是递归边界。 

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        n=len(nums)
        if n==0:
            return 0
        return self.max_sub(nums,0,n-1)
    #计算连续数组的最大和
    def max_sub(self,nums,left,right):
        if left==right:
            return nums[left]
        mid=(left+right)//2
        return max(self.max_sub(nums,left,mid),
                   self.max_sub(nums,mid+1,right),
                   self.max_cross(nums,left,mid,right))
    #计算跨越mid元素的最大和
    def max_cross(self,nums,left,mid,right):
        s1=0
        max_left=0
        start_left=mid-1
        while start_left>=left:
            s1+=nums[start_left]
            max_left=max(s1,max_left)
            start_left-=1
        
        s2=0
        max_right=0
        start_right=mid+1
        while start_right<=right:
            s2+=nums[start_right]
            max_right=max(s2,max_right)
            start_right+=1
        
        #最终结果
        return max_left+nums[mid]+max_right
        
        

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值