【问题标题】:loop through the list to get Maximum sum for a given range in python遍历列表以获取python中给定范围的最大总和
【发布时间】:2021-12-30 18:27:44
【问题描述】:

我是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 答案:1333 当 k = 2

【问题讨论】:

    标签: python python-3.x loops for-loop


    【解决方案1】:

    您可以先将第一个 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 是进来的新号码。

    【讨论】:

      【解决方案2】:

      这是您想要的简化代码,它需要 O(n) 的时间复杂度。这种方法基于滑动窗口算法

      ma​​xSum 是一个函数,它接受 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
      

      【讨论】:

        猜你喜欢
        • 2020-06-03
        • 1970-01-01
        • 1970-01-01
        • 2013-12-06
        • 1970-01-01
        • 2013-04-06
        • 2022-10-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多