特定范围内的数字出现次数?

时间:2014-03-16 04:43:00

标签: arrays algorithm data-structures segment-tree

给定一个大的未排序数组,我需要找出特定范围内给定数字的出现次数。 (可以有很多查询)

e.g。如果是[]={ 6,7,8,3,4,1,2,4,6,7,8,9}left_range=3以及right_range=7number=4,那么输出将为2.(考虑0索引数组)

arr [i]可以在1到100000的范围内。阵列最多可以包含100000个数字。

您能指导我在这里使用哪种数据结构或算法吗?

PS:允许预处理数组。

1 个答案:

答案 0 :(得分:8)

这是一个不需要分段树的解决方案。

<强>预处理:

  1. 对于每个数字arr[i],将i推送到索引为arr[i]的2D矢量(或ArrayList)。
  2. 回答查询

    对于任何查询,对vector [num]进行二元搜索,找到该向量中num的最大索引的索引,该索引小于或等于right range,让我们称之为R.然后找到大于的最小索引或等于左范围,我们称之为L.打印R - L + 1

    <强>运行: 每个项目的O(1)预处理,总O(N)时间。 每个查询答案:O(lg(N))

    空格:相当线性假设vector或ArrayList