最大重叠矩形数

时间:2017-10-10 22:49:34

标签: algorithm

我已经看过这个面试问题,并且不知道如何做到这一点: 给定N个矩形,找到重叠矩形的最大数量。 例如,对于由左下和右上点表示的矩形,[(1,1),(3,3)],[(2,2),(4,4)],[(1,3),( 2,4(2)],[(2,2),(3,3)],返回3,因为前两个和最后一个矩形重叠。我可以想到一个时间复杂度为O(n ^ 2)的算法,但应该有一个O(NlogN)算法。

2 个答案:

答案 0 :(得分:2)

为了找到最大重叠次数,我们需要执行以下操作:

  • 将每个矩形分成两段,即开放和结束,例如,矩形[(0,0)(1,1)] - >我们可以使用两个段[(0,0)(0,1)]和[(1,0),(1,1)]来表示它。

  • 根据x坐标对所有细分进行排序。

  • 迭代这些段,同时维护一个段树来跟踪矩形:

    • 如果片段是开放的并且具有坐标(x,y1)(x,y2) - >将段树中的段(y1,y2)增加一个。

    • 如果片段接近并且具有坐标(x,y1)(x,y2) - >将段树中的段(y1,y2)减一。

  • 当我们遇到一个开放段(x,y1)(x,y2)时,我们还会检查段树中(y1,y2)中存在多少段,这些数字中的最大值是最终结果。

请注意,段树中的每个添加/删除/搜索查询都是O(log n) - >我们得到一个O(n log n)解。

答案 1 :(得分:1)

My O(N ^ 2)算法如下所示:

  1. 对底部和顶部边缘的所有y轴值进行重复排序,在本例中,我们将获得(1,2,2,3,3,4)。此步骤给出(NlogN)时间复杂度。而且对于每个值,我们还需要记录它所属的矩形。

  2. 获取每个矩形的左右边缘的所有x轴值(每个2N值,在本例中,我们将得到(1,2,3,4))。对于每个x值,我们在图像中创建一条穿过(x,0)的垂直线。

  3. 对于每条垂直线,迭代在第一步中排序的所有值,计算在当前垂直线上重叠的最大矩形数。我们可以通过扫描线算法在O(N)时间内完成(在我们的例子中,在值1处我们有1个矩形,然后转到值2,添加两个矩形因此重叠3个矩形,值3,添加一个并且剩下的另一个,2个矩形重叠)。因此,它总共会给出O(N ^ 2)时间复杂度。