加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 列表元素的最大总和,每个列表元素由(至少)k个元素分隔

发布时间:2020-12-20 11:53:53 所属栏目:Python 来源:网络整理
导读:给出一个数字列表,找到时间复杂度为o(n)且空间复杂度为o(1)的非相邻元素的最大总和,我可以使用: sum1= 0sum2= list[0]for i in range(1,len(list)): num= sum1 sum1= sum2+ list[i] sum2= max(num,sum2)print(max(sum2,sum1)) 只有当k = 1 [求和数之间只有
给出一个数字列表,找到时间复杂度为o(n)且空间复杂度为o(1)的非相邻元素的最大总和,我可以使用:

sum1= 0
sum2= list[0]

for i in range(1,len(list)):
    num= sum1
    sum1= sum2+ list[i]
    sum2= max(num,sum2)

print(max(sum2,sum1))

只有当k = 1 [求和数之间只有一个元素]时,这个代码才有效,如何通过动态编程改变k值来改善它.其中k是求和数之间的元素数.
例如:

list = [5,6,4,1,2] k = 1
答案= 11#5 4 2

list = [5,2] k = 2
答案= 8#6 2

list = [5,3,10,2] k = 1
答案= 15#5 10

解决方法

这是Ami Tavory描述的算法的快速实现(据我所知).它适用于任何序列,但如果列表全部为负数,则最大总和将为0(空子序列的总和).

import collections

def max_sum_separated_by_k(iterable,k):
    best = collections.deque([0]*(k+1),k+1)
    for item in iterable:
        best.appendleft(max(item + best[-1],best[0]))
    return best[0]

这使用O(k)空间和O(N)时间.所有deque操作,包括向一端附加值(并从另一端隐式删除一个以保持长度限制)和从末尾读取,都是O(1).

如果您希望算法返回最大子序列(而不仅仅是其总和),您可以将deque的初始化更改为以空列表而不是0开始,然后追加max([item] best [-1],最佳[0],key = sum)在循环体中.但这样效率会相当低,因为它会在整个地方添加O(N)操作.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读