LeetCode 593. 有效的正方形

593. 有效的正方形

题目:给定2D空间中四个点的坐标 p1, p2, p3 和 p4,如果这四个点构成一个正方形,则返回 true 。
点的坐标 pi 表示为 [xi, yi] 。输入 不是 按任何顺序给出的。
一个 有效的正方形 有四条等边和四个等角(90度角)。

链接 https://leetcode.cn/problems/valid-square

个人思路
  1. 思路1:刚开始是想任取三个点,计算他们的两两边长来比较得出对边的两个点,然后来判断是否为等腰直角三角形来确定是否为正方形,然后写着写着感觉有点麻烦,就画了一下草图,改为了计算四条边两两之间的边长平方放入一个列表lenSide,然后排序,当 (lenSide[0]==lenSide[3]) and (lenSide[4] == lenSide[5]) and (lenSide[0]+lenSide[1] == lenSide[4])时,就是正方形了,然后就忽略了四个点都是一个坐标的情况,这时候加一个lenSide[0]是否为0的判断就好
class Solution:
    def validSquare(self, p1: List[int], p2: List[int], p3: List[int], p4: List[int]) -> bool:
        # 计算边长平方
        def length(m,n):
            a = (m[0] - n[0])**2 + (m[1] - n[1])**2
            return a 
        dot = [p1,p2,p3,p4]
        lenSide = []
        for i in range(3):
            for j in range(i+1,4):
                lenSide.append(length(dot[i],dot[j]))
        lenSide.sort()
        # 防止四个点都一样,即只有一个点的情况
        if lenSide[0] == 0:
            return False
        if (lenSide[0]==lenSide[3]) and (lenSide[4] == lenSide[5])  \
            and (lenSide[0]+lenSide[1] == lenSide[4]):
            return True
        else:
            return False

看了评论发现,连(lenSide[0]+lenSide[1] == lenSide[4])这个判断都可以省略,因为四条边相等已经是菱形,加上对边相等那就是正方形了

官方思路
  1. 数学
    (1)如果两条斜边的中点相同:则说明以该两条斜边组成的四边形为「平行四边形」。
    (2)在满足「条件一」的基础上,如果两条斜边的长度相同:则说明以该两条斜边组成的四边形为「矩形」。
    (3)在满足「条件二」的基础上,如果两条斜边的相互垂直:则说明以该两条斜边组成的四边形为「正方形」。
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

复杂度分析
时间复杂度:O(1)。
空间复杂度:O(1),仅使用常数变量。

作者:LeetCode-Solution
链接:https://leetcode.cn/problems/valid-square/solution/you-xiao-de-zheng-fang-xing-by-leetcode-94t5m/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值