Algorithm 每次查询后的最大矩形大小(算法)
我最近在一次采访中遇到了这个算法问题。问题是这样的: 最初有一个矩形(从原点(0,0)开始,到(n,m)结束)。然后是像x=r或y=c这样的q查询,它基本上将初始矩形划分为更小的矩形。每次查询后,我们必须返回当前最大的矩形大小。 见下图: 所以,这里我们最初得到一个从(0,0)到(6,6)的矩形[实际上是一个正方形!!]。现在,在第一次查询(如上面的虚线所示)x=2之后,最大的矩形大小是24。在第二个查询y=1之后,最大的矩形大小为20。事情就是这样一直持续下去的 我解决这个问题的方法是: 在每个查询中,查找: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。事情就是这样一直持续下去的 我解决这个问题的方法是: 在
x轴上的最大间隔(maxX)[将所有x=r值保存在列表中]
y轴上的最大间隔(maxY)[将所有y=c值保存在另一个列表中]
我的解决方案正确吗?如果没有,解决问题的正确方法是什么。如果是,我如何优化我的解决方案?是的,您的算法是正确的 优化它,首先,只考虑一个维度,因为几何中的两个维度是完全正交的。 因此,您需要有一个数据结构,它将一个区间划分为子区间,并支持这两个操作的快速应用:
每个查询将是O(logn)。在列表中插入和删除仍然是线性时间,因此最终的复杂性仍然是O(n^2)。感谢您指出堆的错误,您的用户名没有说谎;)@BlackBear我认为您可以使堆工作,但是为了跟踪堆中的位置,您可能必须自己实现堆操作,总体而言,这听起来很麻烦:-)。或者,代替位置,间隔可以存储它们是否仍然有效,然后堆可能是惰性的(不要立即删除,但在查找max元素时,删除堆顶部,直到仍然有效的间隔位于顶部)。但我认为另一棵树而不是一堆更方便。