查找给定范围内最长连续 1 的频率
Find frequency of longest consecutive 1's in given range
类型为 [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(,需要常量内存并且可以流式传输数据(无需随机访问(。
相关文章:
- 芬威克树(BIT).找到具有给定累积频率的最小索引,单位为 O(logN)
- 模板元程序查找相似的连续类型名称
- 在指针的帮助下,文本文件中单词的频率
- 函数计算用户按下按钮的频率
- EASTL矢量<向量<int>>连续的
- 当需要超过16GB的连续内存时,内存分配失败
- 在条件变量中触发错误信号的频率是多少
- 我应该如何表示我拥有的连续元素序列?
- 蛇在C++不会连续转两次
- 有没有一种优雅而快速的方法来测试整数中的 1 位是否位于连续区域
- 如何知道n!是否可以表示为三个连续数字的乘法?
- 连续枚举 C++11
- 两个连续的 OpenMP 并行区域会相互减慢速度
- 可以将两个相同类型的连续数组视为一个数组吗?
- C++,您能否设计一种数据结构,将指针保存在连续内存中并且不会使它们失效?
- 我已经建立了递归关系,它找到了两个字符串之间最长的连续公共字符串,我怎么能跳过其中一个字符串中的一个字符
- 这种用于查找连续子数组中最大和的递归算法有什么优势吗?
- std::stack 是连续的吗?
- 查找给定范围内最长连续 1 的频率
- 检查数组值连续出现的频率