arrays - 计算数组中不包括某些特定对的子数组的适当数量?

标签 arrays algorithm

假设我有一个像这样的数组:

1 2 3 4 5 

给定的对是(2,3),那么其中不存在(2,3)的可能子数组的数量将是,,

1. 1
2. 2
3. 3
4. 4
5. 5
6. 1 2
7. 3 4
8. 4 5
9. 3 4 5

所以,答案是9

显然,这样的对还可以有更多。

现在,我想到的一种方法是 O(n^2),其中涉及查找最大长度 n 的所有此类元素。我可以做得更好吗?谢谢!

最佳答案

让我们看看,这个临时伪代码应该是 O(n):

array = [1 2 3 4 5]
pair = [2 3]
length = array.length
n = 0
start = 0

while (start < length)
{
    # Find next pair

    pair_pos = start
    while (pair_pos < length) and (array[pair_pos,pair_pos+1] != pair)   # (**1)
    {
        pair_pos++
    }

    # Count subarrays

    n += calc_number_of_subarrays(pair_pos-start)  # (**2)

    # Continue after the pair

    start = pair_pos+2
}

print n

注意**1:这似乎涉及到外循环内部的循环。由于数组的每个元素都被访问一次,因此两个循环的复杂度为 O(n)。事实上,重构它以仅使用一个 while 循环可能很容易。

注意 **2:给定一个长度为 l 的数组,有 l+(l-1)+(l-2)+...+1 个子数组(包括数组本身)。计算起来很容易,时间复杂度为 O(1),不涉及循环。 c/f 欧拉。 :)

关于arrays - 计算数组中不包括某些特定对的子数组的适当数量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32026505/

相关文章:

php - "Notice: Undefined variable"、 "Notice: Undefined index"、 "Warning: Undefined array key"和 "Notice: Undefined offset"使用 PHP

java - 如何在不使用内置数组的情况下创建数组?

计算仅包含元音的子串的数量

algorithm - 动态规划 "Solitare Board Game"

algorithm - 我们能否使用循环不变量来证明算法的正确性,在循环不变量中我们证明它在第一次迭代之后而不是之前为真?

c - 真值表的最优实现

python - 将 numpy 数组传递给 C++ 函数并返回 numpy 数组作为输出的最有效方法是什么?

c++数组赋值多个值

c - 将 3D 数组作为参数传递给 C 中的函数

javascript - 如何实现(快速)bigint 划分?