包含给定查询点的时间间隔数

时间:2018-10-10 20:50:32

标签: arrays algorithm sorting intervals

我知道存在类似的问题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.

我该如何解决我的算法?

2 个答案:

答案 0 :(得分:0)

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

第一:

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

然后,对于每个点p:

  1. 在条目数组中进行二进制搜索以找到条目位置的数量<= p。
  2. 在出口数组中进行二进制搜索以找到出口位置数量<= p。
  3. 包含该点的时间间隔数是entry_count-exit_count

请注意,位置数<= p是第一个元素的索引> 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

答案 1 :(得分:0)

问题是您的间隔是[]而不是[),答案可能是后者。首先将您的最终索引转换为值-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。否则,对点进行二进制搜索以获取索引,而答案就位于积累的[index]上。