LeetCode——593.有效的正方形

通过万岁!!!

  • 题目:给你四个点判断是不是正方形。
  • 思路:判断正方形的方式有很多,我采用的是两条边相等,并且成直角。然后再找一组即可。只不过这里点的顺序不一样,所以存在三种情况。从1开始触发,1234,1243,1324。如果不理解,可以自己画图看看。然后我们就判断12和13或者12和14或者13和14,然后再判断另外两条边和形成的角即可。
  • 技巧:图形的判断

java代码——冗长一点的

class Solution {
    public boolean validSquare(int[] p1, int[] p2, int[] p3, int[] p4) {
        if (p1[0] == p2[0] && p1[1] == p2[1]) {// 四个重复的点
            return false;
        }
        int side12 = (p1[0] - p2[0]) * (p1[0] - p2[0]) + (p1[1] - p2[1]) * (p1[1] - p2[1]);
        int side13 = (p1[0] - p3[0]) * (p1[0] - p3[0]) + (p1[1] - p3[1]) * (p1[1] - p3[1]);
        int side14 = (p1[0] - p4[0]) * (p1[0] - p4[0]) + (p1[1] - p4[1]) * (p1[1] - p4[1]);
        if (side12 == side13 && isVer(p1, p2, p3)) {// 1243
            int side34 = (p3[0] - p4[0]) * (p3[0] - p4[0]) + (p3[1] - p4[1]) * (p3[1] - p4[1]);
            int side24 = (p2[0] - p4[0]) * (p2[0] - p4[0]) + (p2[1] - p4[1]) * (p2[1] - p4[1]);
            if (side34 == side24 && isVer(p4, p3, p2)) {// 菱形,还得有一个直角
                return true;
            } else {
                return false;
            }
        }
        if (side12 == side14 && isVer(p1, p2, p4)) {// 1234
            int side34 = (p3[0] - p4[0]) * (p3[0] - p4[0]) + (p3[1] - p4[1]) * (p3[1] - p4[1]);
            int side23 = (p2[0] - p3[0]) * (p2[0] - p3[0]) + (p2[1] - p3[1]) * (p2[1] - p3[1]);
            if (side34 == side23 && isVer(p3, p4, p2)) {// 菱形,还得有一个直角
                return true;
            } else {
                return false;
            }
        }
        if (side13 == side14 && isVer(p1, p4, p3)) {// 1324
            int side23 = (p3[0] - p2[0]) * (p3[0] - p2[0]) + (p3[1] - p2[1]) * (p3[1] - p2[1]);
            int side24 = (p2[0] - p4[0]) * (p2[0] - p4[0]) + (p2[1] - p4[1]) * (p2[1] - p4[1]);
            if (side23 == side24 && isVer(p2, p3, p4)) {// 菱形,还得有一个直角
                return true;
            } else {
                return false;
            }
        }
        return false;
    }


    public boolean isVer(int[] p1, int[] p2, int[] p3) {// 12与13垂直
        if ((p1[1] - p2[1]) * (p1[1] - p3[1]) + (p1[0] - p3[0]) * (p1[0] - p2[0]) == 0) {
            return true;
        } else {
            return false;
        }
    }
}

java代码——整理过后

class Solution {
    public boolean validSquare(int[] p1, int[] p2, int[] p3, int[] p4) {
        if (p1[0] == p2[0] && p1[1] == p2[1]) {// 四个重复的点
            return false;
        }
        int side12 = calculateSeid(p1, p2);
        int side13 = calculateSeid(p1, p3);
        int side14 = calculateSeid(p1, p4);
        if (side12 == side13 && isVer(p1, p2, p3)) {// 1243
            if (calculateSeid(p3, p4) == calculateSeid(p2, p4) && isVer(p4, p3, p2)) {// 菱形,还得有一个直角
                return true;
            } else {
                return false;
            }
        }
        if (side12 == side14 && isVer(p1, p2, p4)) {// 1234
            if (calculateSeid(p3, p4) == calculateSeid(p2, p3) && isVer(p3, p4, p2)) {// 菱形,还得有一个直角
                return true;
            } else {
                return false;
            }
        }
        if (side13 == side14 && isVer(p1, p4, p3)) {// 1324
            if (calculateSeid(p2, p3) == calculateSeid(p2, p4) && isVer(p2, p3, p4)) {// 菱形,还得有一个直角
                return true;
            } else {
                return false;
            }
        }
        return false;
    }


    // 计算垂直
    public boolean isVer(int[] p1, int[] p2, int[] p3) {// 12与13垂直
        if ((p1[1] - p2[1]) * (p1[1] - p3[1]) + (p1[0] - p3[0]) * (p1[0] - p2[0]) == 0) {
            return true;
        } else {
            return false;
        }
    }


    public int calculateSeid(int[] p1, int[] p2) {
        return (p1[0] - p2[0]) * (p1[0] - p2[0]) + (p1[1] - p2[1]) * (p1[1] - p2[1]);
    }
}
  • 总结:题目还是比较简单的,但是可能有些许的繁琐。并且用到了一些数学方面的知识。这里不太严谨,其实我求的边长是实际变长的平方。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值