我得到了一组N个2D坐标。配对
的所有可能的2个组合坐标,那么我们可以形成N *(N-1)/ 2个平行于
的矩形两个点均为相邻顶点的两个轴。现在,我需要找到
这些矩形的面积之和,其中采用强行压缩(即迭代
通过所有组合)获得TLE。所以到目前为止,我最大的尝试是:
For example, if N = 5, then for all coordinates (xi, yi) where 0 <= i < N:
the sum of rectangle areas would be
(x0 - x1) * (y0 - y1) +
(x0 - x2) * (y0 - y2) +
.
.
.
(x3 - x4) * (y3 - y4)
=
x0y0 + x1y1 - x0y1 - x1y0 +
x0y0 + x2y2 - x0y2 - x2y0 +
.
.
.
x3y3 + x4y4 - x3y4 -x4y3
=
(N-1) * (x0y0 + x1y1 + x2y2 + x3y3 + x4y4) -
x0 * (y1 + y2 + y3 + y4) -
x1 * (y0 + y2 + y3 + y4) -
x2 * (y0 + y1 + y3 + y4) -
x3 * (y0 + y1 + y2 + y4) -
x4 * (y0 + y1 + y2 + y3)
we can calculate the sum of y coordinates while input,
then we can get the last four terms by simply subtracting the corresponding y coordinate
of the coefficient (x0 ~ x4).
Thus, all five terms can be calculated with O(n) time complexity.
然后我发现了一个重大缺陷,这让我很失望:
这在x0 > x1, y1 > y0
(或任何其他两个坐标)下将不起作用,
此矩形的区域变为x0y1 + x1y0 - x0y0 -x1y1
的地方,
与我的方法不同。
是否可以解决此问题(当然,无需花费时间
复杂度O(n ^ 2)),或者为此的算法实际上是完全
另外一个?
编辑:内存使用率不是问题
编辑2:坐标可以重复,或具有相同的x(y)值。在这种情况下,面积为0
答案 0 :(得分:2)
您的给定问题可以用O(n * log(n))时间复杂度来解决,这是我们可以解决的方法:
让我们固定一个点(x 0 ,y 0 ),我们要为该点计算可以使用此点制定的所有可能矩形的总和。< / p>
相同的公式将是:
对于所有x i 和y i ,其中(x 0 ≥x i && y 0 ≥y i ),可以将公式简单地分解为
= ∑(x 0 y 0 + x i y i )-(x i y 0 + x 0 x i )
现在让我们讨论如何计算O(log(n))中公式的每个组成部分。
对于所有其他情况,我们只需要对与上述每个组件相关的符号以及要使用前缀和数组或加法器计算的和范围进行微调即可。 2D BIT树。
如有需要,我愿意解释更多。希望这为您解决特定问题提供了一个良好的起点。干杯! :)
答案 1 :(得分:0)
使用ABS(x_i-x_j)* ABS(y_i-y_j)
因为您正在求和每个矩形的面积。这意味着矩形的面积彼此独立。因此,必须生成O(n ^ 2)个矩形并找到每个矩形的面积,以便O(n ^ 2)。
考虑简单的情况;点是(0,0),(2,1),(1,2)。并得出结论,您必须计算所有面积。
如果要计算的是所有矩形的覆盖范围所产生的,那将是另一种情况。