【发布时间】:2017-10-10 22:49:33
【问题描述】:
我看过这个面试问题,但不知道如何回答: 给定 N 个矩形,找出重叠矩形的最大数量。 例如,对于由左下角和右上角点表示的矩形,[(1, 1), (3, 3)], [(2, 2), (4, 4)], [(1, 3), ( 2, 4)], [(2, 2), (3, 3)],返回 3 因为前两个和最后一个矩形重叠。我可以想到一个时间复杂度为 O(n^2) 的算法,但应该有一个 O(NlogN) 的算法。
【问题讨论】:
-
先发布解决方案,然后寻求优化帮助。
-
我想不出一个 O(NlogN) 的解决方案(但无论如何我不是算法专家......)。我可以想到一些替代方法来做到这一点,但不一定比你的 O(n^2) 蛮力解决方案更好。除了你提供的样本数据,我想问面试官输入的数据一般会是什么样子?例如N可以有多大?矩形可以有多大?它们是 [(1, 1), (3, 3)] -ish 大小还是 [(1000, 1000), (30000000, 30000000)] ?
-
查看 Lucanus Simonson 的 polygon 包算法。他的实现是 C++ BOOST 库的一部分。他开发了一种基于点的多边形演算,将基本的布尔运算(例如交集)减少到线性时间。这应该会有所帮助,尽管我还没有说服自己有一个简单的迭代来利用它来实现所需的解决方案。
-
你需要使用一些特殊的数据结构比如Fenwick tree或者Segment tree来实现O(n log n)。你知道他们吗?
-
Segment tree 是的,你能简单解释一下这个想法或者给我一些实现O(nlogn)时间复杂度的参考吗?
标签: algorithm