#coding=utf-8
import math
def getCroosMaxNum(arr,low,mid,high):
lsum=-(math.inf)
leftsum=0
a=list(range(low,mid))
a.reverse()
b=a
for i in b:
leftsum=arr[i]+leftsum
if lsum<leftsum:
lsum=leftsum
leftindex=i
rsum=-(math.inf)
rightsum=0
c=list(range(mid,high))
d=c
for j in d:
rightsum=arr[j]+rightsum
if rsum<rightsum:
rsum=rightsum
rightindex=j
return leftindex,rightindex,lsum+rsum
def getMaxArray(arr,low,high):
#arr=arr[low:high]
if len(arr)==1:
print(arr,low,high)#[3],0,1,[4,1,2]
return low,high,arr[0]
else:
mid=(low+high)//2
#向下取整。3,1,0
leftlow,lefthigh,leftsum=getMaxArray(arr[:mid],low,mid)
"递归,向左递归,"
print(arr,mid,high) #[3,4],1,2 [3, 4, 5, -2] 2,4
rightlow,righthigh,rightsum=getMaxArray(arr[mid:],mid+1,high)
print(rightlow,righthigh,rightsum) #1 2 4
print(arr,low,mid,high)#[3, 4] 0 1 2
crosslow,crosshigh,crosssum=getCroosMaxNum(arr[:],low,mid,high)
if leftsum > rightsum and leftsum >crosssum:
return leftlow,lefthigh,leftsum
elif rightsum >leftsum and rightsum >crosssum:
return rightlow,righthigh,rightsum
else:
return crosslow,crosshigh,crosssum
a=[3,4,5,-2,-9,8,2,-2,-7]
a.extend([])
minindex,maxindex,maxsum=getMaxArray(a,0,len(a))
print(minindex,maxindex,maxsum)
#print(getCroosMaxNum(a,0,len(a)//2,len(a)))
import math
def getCroosMaxNum(arr,low,mid,high):
lsum=-(math.inf)
leftsum=0
a=list(range(low,mid))
a.reverse()
b=a
for i in b:
leftsum=arr[i]+leftsum
if lsum<leftsum:
lsum=leftsum
leftindex=i
rsum=-(math.inf)
rightsum=0
c=list(range(mid,high))
d=c
for j in d:
rightsum=arr[j]+rightsum
if rsum<rightsum:
rsum=rightsum
rightindex=j
return leftindex,rightindex,lsum+rsum
def getMaxArray(arr,low,high):
#arr=arr[low:high]
if len(arr)==1:
print(arr,low,high)#[3],0,1,[4,1,2]
return low,high,arr[0]
else:
mid=(low+high)//2
#向下取整。3,1,0
leftlow,lefthigh,leftsum=getMaxArray(arr[:mid],low,mid)
"递归,向左递归,"
print(arr,mid,high) #[3,4],1,2 [3, 4, 5, -2] 2,4
rightlow,righthigh,rightsum=getMaxArray(arr[mid:],mid+1,high)
print(rightlow,righthigh,rightsum) #1 2 4
print(arr,low,mid,high)#[3, 4] 0 1 2
crosslow,crosshigh,crosssum=getCroosMaxNum(arr[:],low,mid,high)
if leftsum > rightsum and leftsum >crosssum:
return leftlow,lefthigh,leftsum
elif rightsum >leftsum and rightsum >crosssum:
return rightlow,righthigh,rightsum
else:
return crosslow,crosshigh,crosssum
a=[3,4,5,-2,-9,8,2,-2,-7]
a.extend([])
minindex,maxindex,maxsum=getMaxArray(a,0,len(a))
print(minindex,maxindex,maxsum)
#print(getCroosMaxNum(a,0,len(a)//2,len(a)))