3 回答
TA贡献1784条经验 获得超9个赞
将间隔的端点放入数组中,将其标记为起点或终点。如果间隔是封闭的,则通过将端点放在起点之前来打破平局来对它们进行排序,如果间隔是半开放的,则将它们放在相反的位置。
1S, 2S, 3E, 4E, 5S, 10E, 12S, 13S, 14E, 15E
然后遍历该列表,跟踪我们处于多少间隔(这等于已处理的起点数减去终点数)。每当我们已经处于一个间隔中而到达起点时,这意味着我们必须具有重叠的间隔。
1S, 2S, 3E, 4E, 5S, 10E, 12S, 13S, 14E, 15E
^ ^
overlap overlap
通过在端点旁边存储数据并跟踪我们所处的间隔,我们可以找到哪些间隔与哪些间隔重叠。
这是一个O(N logN)解决方案,其中排序是主要因素。
TA贡献1796条经验 获得超4个赞
在线间隔问题的标准方法是根据起点对它们进行排序,然后从头到尾走动。O(n*logn)(O(n)如果已经排序)
end = 0;
for (current in intervals) {
if current.start < end {
// there's an intersection!
// 'current' intersects with some interval before it
...
}
end = max(end, current.end)
}
添加回答
举报