[英]loop through the list to get Maximum sum for a given range in python
我是 python 的新手。 我有一个代码,我在其中循环遍历列表以捕获给定范围 k 的最大数字总和。 它工作正常,但我希望它缩短/优化。 “k”可能会有所不同
numb = [100,33,22,200,333,1000,22]
m=0
k=2
sum1=0
temp=[]
for j in range(len(numb)-(k-1)):
for i in range(m,k):
temp.append(numb[i])
if sum1 < sum(temp):
sum1 = sum(temp)
temp=[]
m+=1
k+=1
print(sum1)
答案:当 k = 3 时为 1533 答案:当 k = 2 时为 1333
您可以先将前k
个数字相加。 那是您的起始总和和您当前的最大值。 然后沿着列表运行滑动 window,添加下一个数字并删除 window 之外的数字。
def sum_k(x, k):
m = s = sum(x[:k])
for i, a in enumerate(x[k:]):
b = x[i] # number to remove
s += a - b
m = max(m, s)
return m
numb = [100, 33, 22, 200, 333, 1000, 22]
print(sum_k(numb, 2), sum_k(numb, 3))
这在线性时间内运行,这是最佳的,因为您至少需要查看输入中的每个元素。
循环中的索引i
从零运行到nk-1
,所以虽然我们枚举了x[k:]
,但我们选择的索引来自x[0:]
,所以当我们选择b
时,我们选择的数字是在 window 之外。 同时, a
是进来的新数字。
这是您想要的简化代码,它需要O(n) 的时间复杂度。 这种方法基于滑动 Window 算法。
maxSum是 function,它采用 2 个 arguments(数字和 k 的数组)并返回任何 k 值的最大值。
def maxSum(arr, k):
# Edge case
if len(arr) <= k:
return sum(arr)
sums = sum(arr[:k]) # sum the first 3 val in arr.
start = 0 # tell us the first element index whose value is in sums variable
maximum = sums
for val in arr[k:]:
sums = (sums - arr[start]) + val
# here we first subtracted the start value and then added current value.
# Eg. From [1,2,3,4] sums have 1+2+3, but now sums have ( 1+2+3(previous) - 1(start) ) + 4(current)
# Now check for maximum.
if sums > maximum:
maximum = sums
# now increase start by 1 to make pointer to value '2' and so on.
start += 1
# return maximum
return maximum
arr = [100,33,22,200,333,1000,22]
k = 2
print("For k=2: ", maxSum(arr, k))
k = 3
print("For k=3: ", maxSum(arr, k))
Output:
For k=2: 1333
For k=2: 1533
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.