【发布时间】:2015-05-28 02:47:53
【问题描述】:
假设我们这样定义区间
struct Interval {
float start;
float end;
Interval() : start(0), end(0) {}
Interval(float s, float e) : start(s), end(e) {}
};
如何输出重叠次数最多的区间内的任意一个数字?
例如,给定 [1.2,3.4],[2.6,6.8],[8.5,10.2],[15.1,18.7] 我们可以像 2.7 一样输出 [2.6, 3.4] 内的任何数字,因为 [2.6, 3.4] 是重叠次数最多(两次)的区间。
我的想法是按“开始”对间隔进行排序,然后在所有间隔中运行 for 循环。对于每个区间,我们计算后面的区间有多少个“开始”小于或等于其“结束”,并更新每个循环的最大值。
但这看起来像一个 O(n2) 的解决方案,我们可以做得更好吗?
【问题讨论】:
-
如何在沿着范围移动时根据结束位置将结束间隔堆叠在优先级队列中,弹出最近的结束间隔或根据哪个最近的开始间隔推送下一个开始间隔,同时保持跑步“重叠”计数?
-
如果您还有第二个按结束时间排序的间隔列表,则可以在 O(n log n) 时间内实现按开始时间对间隔进行排序的想法。