【问题标题】:Counting number of contiguous subarrays with positive sum in O(nlogn) using O(n) transformation使用 O(n) 变换计算 O(nlogn) 中具有正和的连续子数组的数量
【发布时间】:2014-09-16 05:05:07
【问题描述】:

我有兴趣找到总和为正值 (sum>0) 的连续子数组的数量。

更正式地说,给定一个整数数组 A[1,...,n] 我希望计算整数对 (i,j) 使得 10.

我熟悉 Kadane 的算法,用于在 O(n) 中找到最大和子数组,并且使用类似的方法我可以在 O(n^2) 中计算这些子数组的数量。

为此,我采用累积总和 T(i)。然后我计算所有 j=1,...,n 和 i=1,...,j 的 T(j)-T(i-1) 并记录最终为正的差异。

显然,尽管有一个 O(n) 时间例程可以将此问题转换为计算反转次数的问题(可以使用归并排序在 O(nlogn) 中实现)。尽我所能,我一直无法找到这种转变。

我确实明白,我必须以某种方式将这种反转与一对 (i,j) 之间的元素之和为正的事实相匹配。

有人对如何执行此操作有任何指导吗?非常感谢任何帮助。

编辑:我实际上是在寻找 O(n) 转换,而不是寻找子数组数量的替代解决方案(不是基于转换加反转计数)。

【问题讨论】:

    标签: algorithm arrays


    【解决方案1】:

    使用原始数组 A,构建另一个数组 sumA,这样:

    sumA[i] = A[0] + A[1] + ... + A[i].
    

    现在在这个 sumA[] 数组中,如果有两个索引 i, j (i

    然后sumA[j] - sumA[i] > 0。这正是索引 i 和 j 之间所有元素的总和。

    因此,问题减少到找到这个数组的反转数。这可以通过使用归并排序对数组 sumA[] 进行降序排序并计算此过程中遇到的反转次数来进行。

    【讨论】:

    • 我实际上在上面的问题中概述了这个想法。不幸的是,在这种情况下,“转换”,即计算所有 i 的 sumA[i],是 O(n^2)
    • @Four_FUN 不,它是 O(n)。它是位置小于 i 的所有元素的总和。总和[0] = A[0]。 sumA[i] = sumA[i-1] + A[i].
    • 你是绝对正确的。我的重大错误。非常感谢好心的先生!我还不能投票,但我问任何可以投票的人!与往常一样,解决方案就在我面前!
    猜你喜欢
    • 2020-02-09
    • 1970-01-01
    • 2021-10-22
    • 2013-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-23
    相关资源
    最近更新 更多