我是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
uj5u.com熱心網友回復:
您可以先將第一個k數字相加。那是您的起始金額和您當前的最大值。然后沿著串列運行一個滑動視窗,添加下一個數字并洗掉超出視窗的那個。
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回圈中的索引 ,運行從零到n-k-1,因此雖然我們列舉了x[k:]我們選擇的索引來自x[0:],所以當我們選擇時,b我們正在選擇超出視窗的數字。同時,a是進來的新號碼。
uj5u.com熱心網友回復:
這是您想要的簡化代碼,它的時間復雜度為 O(n)。這種方法基于滑動視窗演算法。
maxSum是接受 2 個引數(數字陣列和 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))
輸出:
For k=2: 1333
For k=3: 1533
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/362951.html
