给定一个大的未排序数组,我需要找出特定范围内给定数字的出现次数。 (可以有很多查询)
e.g。如果是[]={ 6,7,8,3,4,1,2,4,6,7,8,9}
和left_range=3
以及right_range=7
和number=4
,那么输出将为2.(考虑0索引数组)
arr [i]可以在1到100000的范围内。阵列最多可以包含100000个数字。
您能指导我在这里使用哪种数据结构或算法吗?
PS:允许预处理数组。
答案 0 :(得分:8)
这是一个不需要分段树的解决方案。
<强>预处理:强>
arr[i]
,将i推送到索引为arr[i]
的2D矢量(或ArrayList)。回答查询:
对于任何查询,对vector [num]进行二元搜索,找到该向量中num的最大索引的索引,该索引小于或等于right range,让我们称之为R.然后找到大于的最小索引或等于左范围,我们称之为L.打印R - L + 1
<强>运行强>: 每个项目的O(1)预处理,总O(N)时间。 每个查询答案:O(lg(N))
空格:相当线性假设vector或ArrayList