【问题标题】:Number of occurrences of a number in a particular range?某个数字在特定范围内出现的次数?
【发布时间】:2014-04-21 09:34:31
【问题描述】:

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

例如如果 arr[]={ 6,7,8,3,4,1,2,4,6,7,8,9}left_range=3right_range=7number=4,则输出将为 2。(考虑 0 索引数组)

arr[i] 可以在 1 到 100000 的范围内。数组最多可以有 100000 个数字。

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

PS:允许对数组进行预处理。

【问题讨论】:

  • 如果您只进行一次性查询,可能只是简单地获取一个数组切片并暴力破解它将成为最有效的未排序数组。
  • 啊,如果同一个输入数组可以有很多查询,考虑把数组变成一个结构,可以在O(log n)时间内查询一个数字,然后扩展该结构,然后让您将计数缩小一个范围。换句话说,您在每个数字节点的记录将是包含该数字的索引。
  • @Sudipta - 我创建了一个二维矩阵。对于每个数字 1
  • @aruisdante - 你是在建议像段树这样的东西吗?还是应该为所有数字创建一个邻接列表并仅存储它们出现的索引?
  • @NiklasB。您可能想使用map,以便您可以使用数字存储索引记录,但我试图不完全为他们解决他们的作业。

标签: arrays algorithm data-structures segment-tree


【解决方案1】:

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

预处理:

  1. 对于每个数字 arr[i],将 i 推入索引为 arr[i] 的二维向量(或 ArrayList)。

回答问题

对于任何查询,对 vector[num] 进行二分搜索,以找到该向量中 num 的最大索引小于或等于右范围的索引,我们称其为 R。然后找到大于的最小索引或等于左范围,我们称它为 L。打印 R - L + 1

运行时: 每个项目在 O(1) 中进行预处理,总共花费 O(N) 时间。 每个查询答案:O(lg(N))

空格:相当线性的假设向量或数组列表

【讨论】:

  • 快速而简单。事实上,它似乎是“相当线性的”:D
  • 这基本上就是我的建议,尽管实际上并没有明确使用map,因为你是在使用数组就地执行它。为你点赞:)
猜你喜欢
  • 1970-01-01
  • 2017-09-15
  • 2020-11-09
  • 2015-12-13
  • 1970-01-01
  • 2010-11-26
  • 2015-09-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多