C++ 给定一个区间向量,输出区间内重叠次数最多的任意一个数字
假设我们这样定义间隔C++ 给定一个区间向量,输出区间内重叠次数最多的任意一个数字,c++,algorithm,sorting,C++,Algorithm,Sorting,假设我们这样定义间隔 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.6,3.4]范围内的任何数字,比如2.7,因为[
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.6,3.4]范围内的任何数字,比如2.7,因为[2.6,3.4]是重叠次数最多(两次)的区间
我的想法是按“开始”对间隔进行排序,然后在所有间隔中运行for循环。对于每个间隔,我们计算以下间隔中小于或等于其“结束”的“开始”数,并更新每个循环的最大值
但这看起来像一个O(n2)解决方案,我们能做得更好吗?这里有一个简单的O(n log n)
解决方案,它使用事件和扫描线:
时间复杂度是
O(n log n)
(我们只是对事件数组进行排序,然后对其进行一次线性传递)。沿着范围移动时,如何根据结束位置将结束间隔堆叠在优先级队列中,弹出最近的结束间隔或根据最近的开始间隔推下一个开始间隔,同时保持运行的“重叠”计数?您按开始时间对间隔进行排序的想法可以在O(n log n)中使用如果你还有第二个按结束时间排序的时间间隔列表,你就可以得到正确的负间隔处理作为奖励。可爱。我不确定我是否正确理解了您的算法,但在示例中[2.6,3.4]不是原始间隔之一?我们想要一个在这个范围内的数字,比如2.7或3。1@user3692521问题陈述说我们可以从这个间隔中输出任何数字。很容易证明,在给定的区间中,至少有一个适合的端点。哦,我明白了,这很聪明!