给定长度< = 10 ^ 5 的二进制数组和几乎相同数量的查询。每个查询由两个整数(l,r)给出,对于我们计算机的每个查询,连续 0 的总数和 1 在 [l,r] 范围内。
如果 n 是数组的长度,那么 1< = l< r< = n 。
例如:
如果二进制数组( 1 -indexed)为“ 011000 ”并且说有5个查询:
1 3
5 6
1 5
3 6
3 4
然后所需的答案是
1
1
2
2
0
我知道这可以通过每个查询的线性时间(最坏情况)算法来解决,但是由于大量的查询,这是不可行的。
只是想知道哪种方法最有效?
答案 0 :(得分:0)
您可以使用O(n)空间复杂度和每个查询的O(log(n))搜索时间来完成此操作。计算大小为1,2,4的窗口的计数....对于给定的查询,您可以找到O(log(n))窗口(最多2个特定大小的窗口),求和,您可以找到答案
答案 1 :(得分:0)
正如Dukeling在评论中所说,你可以在O(n)中预处理来计算一个数组B,其中B [x]包含在[1..r]中看到的连续数字的总数。
这允许O(1)中的查询通过使用数组来计算范围[1,r]中的总数并减去数字中的数字来查找范围[l,r]中的连续数字的数量。范围[1,l]。
Python代码:
def preprocess(A):
last=A[0]
B=[0,0]
num_consecutive=0
for a in A[1:]:
if a==last:
num_consecutive+=1
B.append(num_consecutive)
last=a
return B
def query(B,l,r):
return B[r]-B[l]
A=[0,1,1,0,0,0]
B=preprocess(A)
print query(B,1,3)
print query(B,5,6)
print query(B,1,5)
print query(B,3,6)
print query(B,3,4)