【问题标题】:cumulative sum of list ignoring duplicated elements in O(n)忽略 O(n) 中重复元素的列表的累积总和
【发布时间】:2022-01-11 00:48:32
【问题描述】:

有没有办法在 O(n) 中打印长度为 n 的给定非负整数列表的累积和?

例如,给定一个列表 {3,2,3,12,2}

输出将是:3 5 5 17 17

我必须在无限内存中实现这​​个,所以复杂的结构可能很难做到。

【问题讨论】:

  • @KaziSohan 对于这个输出,列表是 {3,2,3,12,2},因为我们忽略了所有重复的元素
  • 数组的最大值可以是多少?
  • @KaziSohan 最大值没有限制
  • 您必须以某种方式了解哪些数字是重复的。您可以使用map 类型的结构,主要采用O(lg n)。所以我认为O(n)没有办法做到这一点
  • @KaziSohan 我已经使用尝试实现了这个,它是 O(nlogm),m 是最长的元素。我被告知可以在 O(n) 中完成,但我不知道从哪里开始

标签: algorithm time-complexity cumulative-sum


【解决方案1】:

如果您使用 HashSet 来查找已看到的元素,那么您只需要一次通过即可在 O(n) 中解决此问题。

def cumulative_sum(l):
    seen = set()
    result = []
    for e in l:
        last = result[-1] if result else 0
        if e in seen:
            result.append(last)
        else:
            seen.add(e)
            result.append(last + e)
    return result

l = [3, 2, 3, 12, 2]
print(cumulative_sum(l))

【讨论】:

  • 嗨,我刚刚对哈希表做了一些研究。如果我错了,请纠正我,平均时间复杂度是 O(1),但在最坏的情况下,它可能会上升到 O(n)?
  • 如果哈希函数将您的所有值映射到相同的几个桶,它可以上升到O(n)。实践中也有这样的情况,但通常是人们自己编写哈希函数的时候。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-27
  • 1970-01-01
  • 2018-07-02
  • 1970-01-01
相关资源
最近更新 更多