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