这个问题已经回答了,但我面临的主要问题是理解其中一个答案。
来自 https://stackoverflow.com/a/1621913/2673063
以下算法如何O(n)
?
它指出,如果需要,首先对点进行排序/计算凸包(在 O(n log n) 时间内),我们可以假设我们有凸多边形/包,其中的点按照它们在多边形中出现的顺序循环排序。调用点 1, 2, 3, ... , n。让(变量)点 A、B 和 C,分别从 1、2 和 3 开始(按循环顺序)。我们将移动 A、B、C 直到 ABC 是最大面积三角形。(这个想法类似于计算直径(最远对)时使用的旋转卡尺方法。)
在 A 和 B 固定的情况下,只要三角形的面积增加,则前进 C(例如,最初,A=1,B=2,C 前进到 C=3,C=4,……),即只要面积(A,B,C) ≤ 面积(A,B,C+1)。对于那些固定的 A 和 B,这个点 C 将是最大化 Area(ABC) 的点。(换句话说,函数 Area(ABC) 作为 C 的函数是单峰的。)
接下来,如果增加了面积,则推进 B(不改变 A 和 C)。如果是这样,再次如上所述推进C。如果可能,然后再次推进 B,等等。这将给出以 A 作为顶点之一的最大面积三角形。(到这里的部分应该很容易证明,简单地对每个 A 单独执行此操作将得到 O(n2)。但请继续阅读。)现在再次推进 A,如果它改善了面积等。虽然这有三个“嵌套”循环,注意 B 和 C 总是“向前”前进,它们总共最多前进 2n 次(类似 A 最多前进 n 次),所以整个事情在 O(n) 时间内运行。