【问题标题】:Is it possible to get the sum of all contiguous subarrays in O(n) time?是否有可能在 O(n) 时间内获得所有连续子数组的总和?
【发布时间】:2016-10-28 18:46:52
【问题描述】:

作为我正在解决的一个更大问题的一部分,我很好奇是否有可能在线性时间内

{a_0, a_1, ..., a_n-1}

生成映射

f(i,j): sum of elements over range [i,j) for all i,j in {0, 1, ..., n - 1}

例如

{ 5, 1, 89, 0 }

----> 

f(0,1) = 5
f(0,2) = 5 + 1 = 6
f(0,3) = 5 + 1 + 89 = 95
f(0,4) = 5 + 1 + 89 + 0 = 95
f(1,2) = 1
f(1,3) = 1 + 89 = 90
f(1,4) = 1 + 89 + 0 = 90
f(2,3) = 89
f(2,4) = 89 + 0 = 89
f(3,4) = 0

【问题讨论】:

    标签: algorithm data-structures time-complexity


    【解决方案1】:

    虽然您不能在线性时间内产生 O(n2) 数量的数据,但您可以在线性时间内构建一个数据结构,让您在 O(1 )。

    为此,您需要构建一个数组 s,这样 si 表示从零到 ia 的总和,包括两端.

    您可以通过设置 s[0] = a[0] 然后为每个大于零的 i 设置 s[i] = s[i-1] + a[i] 来构建部分和数组。

    有一个部分和数组可以让你计算

    f(x,y) = s[y] - (x==0 ? 0 : s[x-1])
    

    【讨论】:

    • 这可以在没有任何辅助数据结构的情况下完成。
    • @A.Mashreghi 这很大程度上取决于你所说的“这个”是什么意思。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 2015-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多