【问题标题】:Number of intervals that contains a given query point包含给定查询点的区间数
【发布时间】:2018-10-14 22:12:53
【问题描述】:

我知道存在类似的问题here。我的问题也相同,我有 N 个间隔(有些可能重叠,有些甚至相同)。然后给出Q点查询,我需要告诉有多少区间包含这个点。

我尝试通过对端点数组进行排序然后按答案中提到的 +1、-1 技巧计算重叠间隔的数量来开发我的算法。但是在执行二进制搜索之后我应该做什么?因为前缀和数组的对应索引并不总是答案。

e.g. 
Intervals are : [1,4] [5,7] [6,10] [7,13]
sorted end point array : [1,4,5,6,7,7,10,13]
+1/-1 array : [1,-1,1,1,1,-1,-1,-1]
prefix sum array : [1,0,1,2,3,2,1,0]

Query : 10
my algorithm gives 1 (corresponding prefix array)
but actual ans should be 2.

我应该如何修正我的算法?

【问题讨论】:

  • 你可以有多少间隔?端点可以有多大?
  • @juvian N
  • 为什么实际答案是 3?只有 [5, 7] 和 [6, 10] 包含 6
  • 你是对的。但仍然检查 q=10 它给出 1 但应该给出 2。编辑问题

标签: arrays algorithm sorting intervals


【解决方案1】:

你链接的问题没有好的答案,所以:

第一:

  1. 将每个区间的入口和出口位置放入单独的数组中。 (如果您使用封闭区间,则退出位置为结束位置 + 1,即在 [4,6] 中,进入为 4,退出为 7。
  2. 对数组进行排序。

那么,对于每个点 p:

  1. 在条目数组中二分查找条目位置的数量
  2. 在出口数组中二分查找出口位置的数量
  3. 包含该点的区间数为 entry_count - exit_count

注意位置数 p 的索引。请参阅:Where is the mistake in my code to perform Binary Search? 以帮助您正确进行搜索。

你的例子:

Intervals: [1,4], [5,7], [6,10], [7,13]
Entry positions: [1,5,6,7]
Exit positions: [5,8,11,14]
Entry positions <= 6:  3
Exit positions <= 6: 1
Intervals that contains 6:  3-1 = 2

【讨论】:

  • 我更喜欢这个解决方案,只是在同一位置有多个起点或终点时进行二分搜索时需要小心。
【解决方案2】:

问题是您的间隔是 [] 而不是 [),答案可能是为后者。首先将您的结束索引转换为值 -1。

在此+“压缩”重复坐标之后,您应该有:

 points = [1,5,6,7,8,11,14]
 sums = [1,0,1,1,-1,-1,-1]
 accumulated = [1,1,2,3,2,1,0]

那么对于一个查询,如果查询 points[max] 返回 0。如果不是,则对 points 进行二分查找以获取索引,答案在累积 [index] 上。

【讨论】:

  • @SujanDutta 二进制搜索 = 匹配低于或等于查询的最高点。在这种情况下,它表示 8,因此索引为 4,accumulated[4] 为 2
  • 现在我明白了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-23
  • 1970-01-01
  • 2016-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多