首先,计算出每个正方形的中心点坐标。使用这两个中心点来确定一条直线,这条直线将通过两个正方形的中心,从而将每个正方形分割为面积相等的两部分。计算直线的斜率 k = (y2中心 - y1中心) / (x2中心 - x1中心) 和截距 b。使用这个直线方程来计算四个交点:两个交点在第一个正方形的边界上,另外两个在第二个正方形的边界上。这些交点取决于直线的斜率。如果斜率的绝对值在-1到1之间(包括),则交点在水平边界上;如果斜率的绝对值大于1,则交点在垂直边界上。最后,从这四个交点中选出最远的两个点作为最终的答案。
时间复杂度: O(1)
空间复杂度: O(1)
class Solution:
def cutSquares(self, square1: List[int], square2: List[int]) -> List[float]:
# 计算直线方程 y = kx + b 的 k 和 b
get_x = lambda y: (y - b) / k
get_y = lambda x: k * x + b
(x1, y1, l1), (x2, y2, l2) = square1, square2
# 计算每个正方形的中心
c1 = (x1 + l1 / 2, y1 + l1 / 2)
c2 = (x2 + l2 / 2, y2 + l2 / 2)
dy, dx = c2[1] - c1[1], c2[0] - c1[0]
points = []
if dx == 0: # 处理垂直直线情况
points = [(c1[0], y1), (c1[0], y1 + l1), (c1[0], y2), (c1[0], y2 + l2)]
else:
k = dy / dx
b = c1[1] - c1[0] * k
if -1 <= k <= 1: # 根据斜率决定使用 x 或 y 的边界计算交点
points = [(x1, get_y(x1)), (x1 + l1, get_y(x1 + l1)),
(x2, get_y(x2)), (x2 + l2, get_y(x2 + l2))]
else:
points = [(get_x(y1), y1), (get_x(y1 + l1), y1 + l1),
(get_x(y2), y2), (get_x(y2 + l2), y2 + l2)]
points = sorted(points) # 排序找到最远的两个点
return [*points[0], *points[-1]]