您的位置:首页 > 编程语言 > Python开发

最大子数组问题的python实现

2018-11-07 19:18 267 查看

最大子数组问题的python实现

给定一个无序数组,其中包含正数和负数,要求找出该数组中连续的几个数,其和相加为最大

#1、暴力法,遍历该该数组中所有子数组

import random
def max_violent(arr):
max=-100
a=0
b=0
for i in range(len(arr)):               #每次所取子数组的头
for j in range(i,len(arr)):       #每次所取子数组的尾
tar=0
for k in range(i,j+1):          #累加该数组元素
tar=tar+arr[k]
if tar>max:
max=tar
a=i
b=k
return (max,a,b)
arr=[]
for i in range(10):
arr.append(random.randint(-10,10))
print(arr)
print('暴力方法:',max_violent(arr))

2、分治思想:
当寻找一个数组的最大子数组的,我们选取子数组的中间元素为基准,这样最大子数组的所在不外乎三种情况
一、子数组完全在基准元素之前;二、子数组完全在基准元素之后; 三、子数组跨过基准元素,部分在前,部分在后

def max_digui(arr,low,high):
if low==high:
return arr[low]
mid=(low+high)//2
m1=max_digui(arr,low,mid)
m2=max_digui(arr,mid+1,high)
now_left=arr[mid]
maxleft=now_left
for i in range(mid-1,low-1,-1):
now_left=now_left+arr[i]
if now_left>maxleft:
maxleft=now_left
now_right=arr[mid+1]
maxright=now_right
for j in range(mid+2,high+1):
now_right=now_right+arr[j]
if now_right>maxright:
maxright=now_right
m3=maxleft+maxright
result=max(m1,m2,m3)
return result
print(max_digui(arr,0,len(arr)-1))

3、动态规划法:
统计前n项和,当前n项和大于0时,说明当向后寻找时可能变得更大,若找到更大值,更新最大值
而当前n项和小于0时,说明最大数组不可能包含这n项,然后舍去前n项,重新更新数组

def max_dongtaiguihua(arr):
t=arr[0]
sum=t
max=sum
for i in range(1,len(arr)):
if sum>0:
sum=sum+arr[i]
if sum>max:
max=sum
else:
sum=arr[i]
return max
print(max_dongtaiguihua(arr))

注:三个代码在一个.py文件内

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: