一串数当中和最大的切片的和

从一个实数序列中截取一个切片(或者片段)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的一些用法。