【问题标题】:Algorithm Lists with pythonpython的算法列表
【发布时间】:2020-11-02 11:23:23
【问题描述】:

我正在尝试寻找一种算法来解决以下 python 问题。

Given a list of integers, check if after dropping two elements of the list, is it possible to divide the list in 3 where the sum of the consecutive numbers are equals.

例如:
A = [1, 3, 4, 2, 2, 2, 1, 1, 2] 应该返回 TRUE 因为我们会丢弃列表中的粗体元素可以在 [1, 3], [2, 2], [2, 1, 1] 中分割,其中所有总和为 4

B = [1, 1, 1, 1, 1, 1] 应该返回 FALSE

C = [1, 1, 3, 1, 1, 1034, 5, 9900, 1, 2] 也应该返回 FALSE 因为即使在删除粗体数字后,您可以将数字相加 5 (1,1,3), (5), (1, 1, 1, 2) 列表应该首先排序,这是不允许的。

我提供了一个似乎可行的解决方案,但它非常非常糟糕,不确定是否总是有效,而且复杂性太高,什么时候应该是 O(n) 我不知道如何迭代从列表中删除 2 个数字而不具有 O(n^2)

的复杂性

谢谢

【问题讨论】:

标签: python list algorithm


【解决方案1】:

确实可以在O(n) 中解决这个问题(假设整数是正数),其中n 是数组A 的大小。

这可能令人惊讶,因为这个问题让人想起装箱问题或子集求和问题,但我们在数组中查找连续求和这一事实使任务变得更加容易。

这是一个python代码:

def find_couple_list_sum(int_list):
    n = len(int_list)
    left_sum = [0 for _ in range(n)]
    for i in range(1, n):
        left_sum[i] = left_sum[i-1] + int_list[i-1]

    right_sum = [0 for _ in range(n)]
    for j in range(n-2, -1, -1):
        right_sum[j] = right_sum[j+1] + int_list[j+1]

    total_sum = sum(int_list)
    print(left_sum)
    print(right_sum)
    print(total_sum)
    i, j = 0, n-1
    while True:
        print(i, j)
        mid_sum = total_sum - left_sum[i] - right_sum[j] - int_list[i] - int_list[j]
        if left_sum[i] == right_sum[j] and left_sum[i] == mid_sum:
            return i, j
        elif i == j:
            return None, None
        elif left_sum[i] < right_sum[j]:
            i += 1
        else:
            j -= 1


int_list = [1, 3, 4, 2, 2, 2, 1, 1, 2]
print(find_couple_list_sum(int_list))

整个过程确实在O(n) 中运行。

【讨论】:

  • 你不是总是在两个被丢弃的元素上分开吗?
  • 是的,我是。事实上,这并不是 OP 所要求的,对于 OP 的问题版本,我看不出如何在 O(n) 中解决问题。
  • 你好@m.raynal,我不完全理解代码,它是否返回将被删除的元素的索引?
  • 是的,它就是这样做的
猜你喜欢
  • 1970-01-01
  • 2011-03-26
  • 2017-08-24
  • 2020-07-02
  • 2016-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多