这个题解的思路是通过检查两对对角线是否等长且垂直来判断四个点是否能构成一个正方形。首先定义了一些辅助函数:checkLength用于检查两个向量的长度是否相等,checkMidPoint用于检查两对点的中点是否相同,calCos用于计算两个向量的点积。然后定义了一个主要的辅助函数help,它接受四个点作为参数,计算两对对角线的向量,然后使用前面定义的辅助函数检查这两对对角线是否满足正方形的条件(等长且垂直)。最后,在Solution类中的validSquare方法中,首先检查任意两个点是否相同(如果相同,则它们不能构成正方形)。然后,它尝试将四个点分成不同的两对,使用help函数检查它们是否能构成正方形。如果其中任何一对满足条件,就返回True,否则返回False。
时间复杂度: O(1)
空间复杂度: O(1)
def checkLength(v1: Tuple[int, int], v2: Tuple[int, int]) -> bool:
return v1[0] * v1[0] + v1[1] * v1[1] == v2[0] * v2[0] + v2[1] * v2[1]
def checkMidPoint(p1: List[int], p2: List[int], p3: List[int], p4: List[int]) -> bool:
return p1[0] + p2[0] == p3[0] + p4[0] and p1[1] + p2[1] == p3[1] + p4[1]
def calCos(v1: Tuple[int, int], v2: Tuple[int, int]) -> int:
return v1[0] * v2[0] + v1[1] * v2[1]
def help(p1: List[int], p2: List[int], p3: List[int], p4: List[int]) -> bool:
v1 = (p1[0] - p2[0], p1[1] - p2[1])
v2 = (p3[0] - p4[0], p3[1] - p4[1])
return checkMidPoint(p1, p2, p3, p4) and checkLength(v1, v2) and calCos(v1, v2) == 0
class Solution:
def validSquare(self, p1: List[int], p2: List[int], p3: List[int], p4: List[int]) -> bool:
if p1 == p2:
return False
if help(p1, p2, p3, p4):
return True
if p1 == p3:
return False
if help(p1, p3, p2, p4):
return True
if p1 == p4:
return False
if help(p1, p4, p2, p3):
return True
return False