【问题标题】:Iterate over a list and return the maximum sum of n continuous values [duplicate]迭代一个列表并返回n个连续值的最大总和[重复]
【发布时间】:2019-12-09 11:56:59
【问题描述】:

问题定义: 有 N 个包含奖品或罚金的盒子。正值 表示它是奖品,负值表示它是 惩罚。表示奖金额或罚金金额的N个值为 作为程序的输入传递。一个人可以挑选任意数量的盒子 但那些箱子必须连续排列。程序必须打印 男子可以选择的最高奖金。

边界条件:

1

输入格式:

第一行包含 N。

第二行包含N个整数,表示奖品或罚款金额,以空格分隔。

示例输入/输出 1:
输入:
9
2 -4 4 3 -2 -1 7 -4 3

输出:
11

说明:
男子选择以下五个盒子时可获得最高奖金 4 3 -2 -1 7


示例输入/输出 2:
输入:
20
63 78 111 43 104 -89 35 57 -55 84 111 91 -18 50 42 100 -67 84 70 63
输出:

957


输入/输出示例 3:
输入:
5
-5 -6 -8 -7 -9
输出:
0

最大执行时间限制: 200 毫秒

我可以解决这个问题,我的算法是正确的,但是执行时间超过了时间限制。

a=int(input())
b=list(map(int,input().split()))
e=[]
for i in range(2,a+1):
    if i!=a:
        for j in range(a-i+1):
            s=0
            for k in range(j,i+j):
                s+=b[k]
            e.append(s)
    else:
        s=0
        for k in range(a):
            s+=b[k]
        e.append(s)
print(max(e))

【问题讨论】:

标签: python python-3.x algorithm list


【解决方案1】:

好的,这是 maximum subarray sum 的一个示例,您可以使用 kadane's 算法(本质上是贪婪算法)以 O(n) 时间复杂度解决这个问题。

片段:

a=int(input())
b=list(map(int,input().split()))

maximum = b[0]
sum = b[0]
for i in range(1,a):
    if sum < 0:
        sum = 0
    sum += b[i]
    maximum = max(maximum,sum)
print(maximum)

算法:

  • 我们保留了 2 个变量,当前的 summaximum 包含答案。
  • 我们不断将数组值添加到sum。如果当前sum 小于0,那么我们使当前sum 等于0,然后添加更多元素。我们这样做是因为我们希望将sum 保持为最大(并且可能为正)。
  • 最后,我们不断更新maximum的值并打印maximum

更新:

由于此问题涉及收取奖金,因此收取负数没有意义。所以,唯一的变化是首先将最大值初始化为0,然后从0开始循环。

片段:

a=int(input())
b=list(map(int,input().split()))

maximum = 0
sum = 0
for i in range(0,a):
    if sum < 0:
        sum = 0
    sum += b[i]
    maximum = max(maximum,sum)
print(maximum) 

【讨论】:

    【解决方案2】:

    @vivek_23 解决方案更快,但我也会给出我的方法。这将减少迭代次数:

    a=int(input())
    b=list(map(int,input().split()))
    print(max(sum(b[start:end]) for start in range(a) for end in range(0, a + 1) if start < end))
    

    【讨论】:

      【解决方案3】:

      您的问题是您正在对列表长度进行多次迭代。相反,您需要考虑一种更好的方法。一种可能的解决方案可能是递归解决方案,您可以从 1 到输入长度进行检查,找到最大的总数,然后递归调用您的函数,传递除第一个之外的其余输入。然后这将再次执行相同的检查,直到没有更多的输入要检查。

      这不像@vivek_23 的回答那么快,但会给你另一种见解来解决这个问题。

      def max_value(input_list, maximum=float('-inf')):
          input_len = len(input_list)
          if input_len:
              for i in range(1, input_len + 1):
                  this_total = sum(input_list[:i])
                  if this_total > maximum:
                      maximum = this_total
              return max_value(input_list[1:], maximum)
          else:
              return maximum if maximum > 0 else 0
      
      
      test_inputs = [
          '2 -4 4 3 -2 -1 7 -4 3',
          '63 78 111 43 104 -89 35 57 -55 84 111 91 -18 50 42 100 -67 84 70 63',
          '-5 -6 -8 -7 -9'
      ]
      
      from timeit import default_timer as timer
      for test_input in test_inputs:
          start = timer()
          print(max_value([int(num) for num in test_input.split()]))
          end = timer()
          print('func time taken', end - start)
      

      输出

      11
      func time taken 0.0009307380000000143
      957
      func time taken 0.0003775810000000157
      0
      func time taken 4.153400000000973e-05
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-11-04
        • 2018-11-03
        • 2013-12-22
        • 2015-10-30
        • 1970-01-01
        • 2023-02-26
        • 2020-07-21
        相关资源
        最近更新 更多