查找给定范围内最长连续 1 的频率

Find frequency of longest consecutive 1's in given range

本文关键字:连续 频率 范围内 查找      更新时间:2023-10-16

类型为 [L, R] 的查询应返回给定范围内静态数组中最长的连续 1的频率。

例:

arr={1,1,0,0,1,1,1,0,0,1,1,1,1}

范围 [L,R] = [3,11](索引从 0 开始(

答案: 2

连续 1 的最大长度为 3:{1,1,1}。

频率为2,因为序列 {1,1,1} 可以在给定范围内找到两次。一次来自索引 4,一次来自索引 9。

约束:

2<=N<=10^5
1<=Q<=10^5

N= 数组大小

Q=范围查询数

输入为:
第一行包含数组中的元素数 - N.
第二行包含所述数组的元素.
第三行包含查询数 Q.
接下来的 Q 行包含范围 [L, R] 0 <= L <= R <N。>

测试:

12
1 1 0 0 1 1 1 0 0 1 1 1
5
3 11
3 10
0 5
1 5
1 4

输出应为:

2
1
2
1
2

我有一个 O(n^2( 的解决方案,但我需要一个更有效的解决方案。

如前所述,该问题看起来微不足道:

int length = 0, count = 0, i = 0;
while (i < n) {
while (i < n && seq[i] == 0) i++;
if (i < n) {
int start = i;
while (i < n && seq[i] == 1) i++;
int size = i - start;
if (size > length) {
length = size;
count = 1;
} else if (size == length)
count += 1;
}
}
}

这个想法很简单:对于每个 1 的序列,如果序列较长更新长度并将计数设置为 1,否则如果长度相等,则增加计数器(如果长度较小,则什么都不做(。 它只是对数据的一次传递:O(n(,需要常量内存并且可以流式传输数据(无需随机访问(。