一串数当中和最大的切片的和
从一个实数序列中截取一个切片(或者片段)A[i,j]使得A[i,j]的和值是该序列中所有片段中最大的。
这个的时间复杂度是n的平方
A=[-9,2,-8,3,10,-4,-10,2,2,8,-9]
return1 = {}
n = len(A)
best = A[0]
for size in range(1,n+1):
cur = sum(A[:size])
# print(cur,"我是第一次%d个数相加"%size)
for i in range(n-size): #11-10
return1[best]=A[i:i+size+1]
best = max(best,cur)
cur += A[i+size] - A[i]
a = sorted(return1.items(),key=lambda d:d[0],reverse = True)
print(a)
这个的时间复杂度是n。是线性的。
A=[12,2,-8,3,10,-4,-10,2,2,8,-9]
i = 0
sum = 0
maxs = 0
while i!=len(A):
sum+=A[i]
maxs = max(sum,maxs)
i+=1
if(sum<0):
sum=0
print(maxs)
但是如果要求把队列同样给输出出来的时候,这个时候就稍微有点麻烦了。需要有两个指针。
from functools import reduce
A = [2,-8,3,10,-2,-10,2,2,8,-9,-1]
i = 0
head = 0#指针头
tail = 0#指针尾
sumss = 0#只要不是负数,就一直加。
maxs = 0#保存最大的值。
while i !=len(A):
sumss+=A[i]
maxs = max(sumss,maxs)#找到最大的值,如果是负数,保持最大值。
if sumss<0:#如果为负数,就重新开始计数
sumss=0
maxs=0
i += 1
head=i
print(head,"我是head")
continue
if maxs == sumss: #如果相等,肯定加的是正数。tail=i 否则就等待。直到相等为止。
tail = i
print(tail,"我是tail")
elif maxs > sumss:
pass
i+=1
print(head,tail)
wantedlist = A[head:tail]
print(type(wantedlist),wantedlist)
print(sum(wantedlist))
print(reduce(lambda x,y:x+y, wantedlist))
遇到的一些问题。
1.题目看似很简单,但写一个时间复杂度是线性,实现起来还是有些复杂的。我写的还是挺繁琐的。大家可以自己写一下,觉得好可以评论一下,让大家一起学习一下。不过最容易写的可能时间复杂度是N的立方。。。这里就不写了。
2.我之前上面用的变量是sum,而下面用sum对list求和的时候,就直接报错。原因就是不能变量和函数名是不能重的!
3.在这个问题解决之间,我也尝试用reduce来解决这个问题,但是发现我找不到reduce了。原因在于python3开始,reduce已经被放到functools里面去了。所以需要导入。
from functools import reduce
另外附上查阅的filter,map,reduce的一些用法。
参考
Python3.4中filter函数,map函数和reduce函数 - 我的新博客 - CSDN博客 http://blog.csdn.net/damotiansheng/article/details/44139111
python算法教程