【问题标题】:Middle element from a disjoint set of sorted intervals来自一组不相交的排序区间的中间元素
【发布时间】:2020-06-12 00:11:48
【问题描述】:

我们想在给定的数字区间中找到中间元素。

假设给定一个包含 3 个区间的集合,它们是 { [1, 10], [20, 30],[35, 40]}。 (间隔总是不相交的)。

如果我们结合所有区间,我们会得到 25 个数字,如下所示:

1、2、3、4、5、6、7、8、9、10、20、21、22、23、24、25、26、27、28、29、 30、35、36、37、38、39、40

答案是中间元素,即第 13 个元素,即 22. 所以答案是 22。

但每个区间的范围都可以是 [1,1000000000]。鉴于 间隔你要计算中间元素。

是否有任何数据结构或算法来编码?

注意:如果有'n'个元素并且'n'甚至是答案 可以是第 (n/2) 个元素。

示例:如果我们合并区间,则总共有四个元素 那么第二个元素就是答案

【问题讨论】:

  • 为什么不只用一个指针从底部和一个指针从顶部迭代间隔,保持元素数量的总和尽可能接近两边,然后找到中间?跨度>
  • 我做不到。这需要很长时间,我会得到 TLE。
  • 需要很长时间?这是 O(n),如果不查看所有区间,怎么能做得更好?
  • 举个例子,我们在左边有 10 个,右边有 6 个,中间有 11 个。我们从 11 的右侧取 4,剩下 20-26,即 7 个​​元素。一分为二,两边取三,以 23 结尾(22 似乎不对——因为有 27 个元素,中间是第 14 个元素)。
  • 通过 O(n),我的意思是 n 是给定的间隔数。

标签: algorithm data-structures numbers set


【解决方案1】:

首先,当我们在您的示例中组合区间时,我们得到 27 个数字,中间元素(中位数)是第 14 个元素,即 23。 正如 גלעד ברקן 在评论中提到的,实现您想要的最快方法是 O(n) 其中 n 是间隔数(在上面的示例中 n = 3)。这是带有解释的Python代码

# I assume your intervals are list in a list
def findMedian(intervals):
   numberOfElements = 0

   for interval in intervals:
      numberOfElements += interval[1] - interval[0] + 1 # We count how many numbers are in each interval

   middleElementPosition = numberOfElements//2 
   median = 0

   # At this point we know how many numbers are in the intervals and the position of the middle number
   # So we go and find the middle number 
   for i in range(len(intervals)):
      if middleElementPosition > (intervals[i][1] - intervals[i][0] + 1):
         middleElementPosition -= (intervals[i][1] - intervals[i][0] + 1)
      else:
         median = intervals[i][0] + middleElementPosition
         break # once we find median we leave loop

    return median

请注意,我们主要处理元素的数量,而不是元素本身。重要的是间隔的数量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-11
    • 2020-08-14
    • 2020-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多