我正在尝试解决著名的天际线问题(见 gif):
输入
(1,11,5), (2,6,7), (3,13,9), (12,7,16), (14,3,25), (19,18,22), (23) ,13,29), (24,4,28)
应该返回,其他建筑物后面的点应该消失,并且 Y 轴变化的坐标应该在返回的天际线中:
(1, 11), (3, 13), (9, 0), (12, 7), (16, 3), (19, 18), (22, 3), (23, 13), (29 , 0)
我试图通过对算法使用分而治之的方法来实现 O(n lg n) 的运行时间,但我被困在合并部分。
每次我想起来我都会感到困惑。例如,我检查天际线首先是哪一个,例如哪个具有较低的 x 坐标,然后我将 + 它的高度添加到我的新天际线。但是后来我遇到了在另外两个天际线后面的天际线,我怎样才能检测到这种“碰撞”?
我是否首先通过检查 left.x2 < right.x1 来检查天际线是否有任何重叠?但后来我想我应该先检查什么?x 轴上的优先级重叠,一切都变成了一个巨大的鸡蛋混乱。
也许我想得太复杂了?我需要的是一组最高的 y 坐标,在每个路口,我应该这样接近它吗?