最大子数组问题的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文件内
阅读更多相关文章推荐
- Python实现求解最大子数组问题
- 连续子数组最大和 python版实现
- 最大子数组问题及C语言实现
- 最大子数组问题-c++代码实现及运行实例结果
- 【最大子数组问题】php实现
- 算法导论 4.1-5 最大子数组问题 线性时间算法 C++简单实现
- 最大子数组问题-c++代码实现及运行实例结果
- 最大子数组问题-暴力求解-c++代码实现及运行实例结果
- 第四章 最大子数组问题(股票最大收益) C++实现 算法导论
- 算法导论-最大子数组问题-线性时间复杂度算法分析与实现
- 最大子数组--python实现
- 最大子数组问题-c++代码实现及运行实例结果
- 最大子数组问题-暴力求解-c++代码实现及运行实例结果
- 最大子数组问题-暴力求解-c++代码实现及运行实例结果
- 一维数组及子数组最大和问题Java实现
- 动态规划--求最大连续子数组的和(Python实现)&求解最大连续乘积字串(Python实现)
- 计算4000000000以内最大的f(n)=n的值---字符串问题python实现(五)
- [151225] Python3 实现最大堆、堆排序,解决TopK问题
- 计算4000000000内的最大f(n)=n值---字符串的问题python实现(五岁以下儿童)
- 算法导论之最大子数组问题 C语言实现