Algorithm 每次查询后的最大矩形大小(算法)

Algorithm 每次查询后的最大矩形大小(算法),algorithm,sorting,rectangles,Algorithm,Sorting,Rectangles,我最近在一次采访中遇到了这个算法问题。问题是这样的: 最初有一个矩形(从原点(0,0)开始,到(n,m)结束)。然后是像x=r或y=c这样的q查询,它基本上将初始矩形划分为更小的矩形。每次查询后,我们必须返回当前最大的矩形大小。 见下图: 所以,这里我们最初得到一个从(0,0)到(6,6)的矩形[实际上是一个正方形!!]。现在,在第一次查询(如上面的虚线所示)x=2之后,最大的矩形大小是24。在第二个查询y=1之后,最大的矩形大小为20。事情就是这样一直持续下去的 我解决这个问题的方法是: 在

我最近在一次采访中遇到了这个算法问题。问题是这样的:

最初有一个矩形(从原点(0,0)开始,到(n,m)结束)。然后是像x=r或y=c这样的q查询,它基本上将初始矩形划分为更小的矩形。每次查询后,我们必须返回当前最大的矩形大小。

见下图:

所以,这里我们最初得到一个从(0,0)到(6,6)的矩形[实际上是一个正方形!!]。现在,在第一次查询(如上面的虚线所示)x=2之后,最大的矩形大小是24。在第二个查询y=1之后,最大的矩形大小为20。事情就是这样一直持续下去的

我解决这个问题的方法是:

在每个查询中,查找:

  • x轴上的最大间隔(maxX)[将所有x=r值保存在列表中]

  • y轴上的最大间隔(maxY)[将所有y=c值保存在另一个列表中]

  • 每次查询时,您的答案都是(maxX*maxY)

    对于查找1和2,我必须遍历整个列表,这不是很有效

    因此,我有两个问题:


    我的解决方案正确吗?如果没有,解决问题的正确方法是什么。如果是,我如何优化我的解决方案?

    是的,您的算法是正确的

    优化它,首先,只考虑一个维度,因为几何中的两个维度是完全正交的。

    因此,您需要有一个数据结构,它将一个区间划分为子区间,并支持这两个操作的快速应用:

  • 将给定的间隔分成两段
  • 找到一个最大的间隔
  • 您可以通过使用两个排序列表来实现这一点,一个按坐标排序,另一个按大小排序。您应该有从一个数据结构到另一个数据结构的指针,反之亦然

    要执行“拆分”操作,请执行以下操作:

  • 使用坐标排序列表中的二进制搜索,找到应拆分的间隔
  • 从两个列表中删除间隔
  • 将两个较小的间隔添加到两个列表中
  • 这是正确的,但每个查询需要O(n)个时间

    对于每个维度,可以有一个用于坐标的二元搜索树(或其他带有O(logn)操作的排序容器)(最初为两个),以及一个用于间隔大小的二元搜索树。然后,对于该维度中的每个查询:

  • 将新坐标添加到坐标
  • 从它的邻域中,计算间隔的旧大小,并将其从大小中移除
  • 计算两个新间隔的大小,并将它们添加到大小中
  • 最大尺寸在尺寸的末尾

  • 每个查询将是O(logn)。

    在列表中插入和删除仍然是线性时间,因此最终的复杂性仍然是O(n^2)。感谢您指出堆的错误,您的用户名没有说谎;)@BlackBear我认为您可以使堆工作,但是为了跟踪堆中的位置,您可能必须自己实现堆操作,总体而言,这听起来很麻烦:-)。或者,代替位置,间隔可以存储它们是否仍然有效,然后堆可能是惰性的(不要立即删除,但在查找max元素时,删除堆顶部,直到仍然有效的间隔位于顶部)。但我认为另一棵树而不是一堆更方便。