- python求最大连续子数组的和
- 从事python自动化的小伙伴,在面试的时候可能都会遇到这样的编程题,在此总结一下,也是给自己做个备忘录:
- 给你一个list,求连续子数组和的最大值,这可能是一道测开的题了,有一定的算法在里面,了解一下,也不难。
(1). 第一种解法比较暴力(穷举法),如果需要求出位置这种方法还是不错的。
#encoding=utf-8
# 暴力求解
l = [0, 1, 2, 3, -6, 5, -6,6,-1,2]
def max_sum(l = []):
#先设定列表的第一个元素为和的最大值
maxVal =l[0]
#定义想想想x,y表示列表的下标
x,y=0,0
for i in range(0,len(l)):
for j in range(i,len(l)):
res = sum(l[i:j+1])
if res > maxVal:
maxVal = res
x = i
y = j
return maxVal,x,y
maxVal, x, y = max_sum(l)
print(maxVal,(x,y))
备注:这里要注意sum求列表元素的和,下标是左开右闭的,所以sum(l[i:j+1])这里要j+1不然最后一个取不到。
(2). 动态分治法,因为最大子列表一定是从一个非0的数开始的(假定列表中有正数有负数)所以就可以暂时筛选调小于0的数,即便列表全是负数,那么最大的子列表肯定是负数最大的一个。
def max_L(list=[]):
#先设定列表的第一个元素为和的最大值
max_sum = list[0]
#定义一个变量存储连续的和
pre_sum = 0
for i in list:
#如何这个连续的和小于0,就从i位置重新开始计算
if pre_sum < 0:
pre_sum = i
else:
pre_sum += i
if pre_sum > max_sum:
max_sum = pre_sum
return max_sum
print(max_L(list))