arrays - 查找数组中总和为零的所有数字

标签 arrays algorithm math satisfiability

给定一个数组,输出数组中总和为0的连续元素。

例如:

对于输入 [2, 3, -3, 4, -4, 5, 6, -6, -5, 10],

输出为 [3, -3, 4, -4, 5, 6, -6, -5]

我找不到最佳解决方案。

说明1:对于输出子数组中的任何元素,子数组中应该有一个子集,它与元素相加为零。

例如:对于 -5,应该存在 子集 {[-2, -3], [-1, -4], [-5], ....}在输出子数组中。

说明2:输出子数组应该是所有连续的元素。

最佳答案

这是一个在 O(n³) 中运行的 python 解决方案:

def conSumZero(input):
    take = [False] * len(input)

    for i in range(len(input)):
        for j in range(i+1, len(input)):
            if sum(input[i:j]) == 0:
                for k in range(i, j):
                    take[k] = True;

    return numpy.where(take, input)

编辑:现在更有效率了! (不确定它是否完全是 O(n²);一旦我计算完复杂性就会更新。)

def conSumZero(input):
    take = [False] * len(input)
    cs = numpy.cumsum(input)
    cs.insert(0,0)

    for i in range(len(input)):
        for j in range(i+1, len(input)):
            if cs[j] - cs[i] == 0:
                for k in range(i, j):
                    take[k] = True;

    return numpy.where(take, input)

这里的区别在于我预先计算了序列的部分和,并使用它们来计算子序列和 - 因为 sum(a[i:j]) = sum(a[0:j]) - sum (a[0:i]) - 而不是每次都迭代。

关于arrays - 查找数组中总和为零的所有数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32681141/

相关文章:

algorithm - 有两个目标的最短路径

java删除列表中的反向字符串

javascript - 在谷歌地图中查找给定英里/公里的半径

Python 或 SQL 逻辑回归

c - 从数组和程序中提取整数值而不显示 printf 函数

javascript - 使用 `For` 循环平移到标记

algorithm - 嵌套循环的第一项和最后一项,从非零索引开始的算术级数之和

javascript - 将值列表作为可过滤内容传递

ios - 使用多个字符串创建 onDoneBlock

java - 如何评估以字符串形式给出的数学表达式?