算法小知识-----7.29-----有效的正方形

375 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第3天,点击查看活动详情

快乐周五了,可恶的刷题依然在继续着

有效的正方形

该题出自力扣的593题 —— 有效的正方形【中等题】,这道就真的是名副其实的数学题了,不过幸好并没有涉及太深的公式

审题

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

image.png

  • 根据题意,其实并不复杂,就是给出4个整型数组,每个数组内部都只有两位数,作为二维坐标的点
  • 如果给出的四个点,最终能够合围成正方形的话,那么就返回True,否则返回false
    • 正方形具备的条件也比较简单,四条边相等,四个角相等且是90度
  • 首先把四个一维整型数组,整合成二维数组
  • 利用正方形的边的特性,两点之间的距离,除了边就是对角线的可能性(排除菱形可能性)
  • 利用HashSet的唯一性,可以确定最终的结果是否只有两种
  • 利用Math的pow方法,加上公式 —— (x1 -x2)² + (y1 -y2)²的开根号,可以得出两点之间的距离
  • 那么就是用两个for循环去实现
  • 需要注意的是,有可能出现点与点之间的距离为0,也就是重复的点。那么就可以剪枝,直接返回false
  • 最终返回set的长度是否小于等于2即可

编码

class Solution {
    public boolean validSquare(int[] p1, int[] p2, int[] p3, int[] p4) {
        // 边 或者 对角
        int[][] p = {p1,p2,p3,p4};
        HashSet<Double> set = new HashSet<>();
        for (int i = 0; i < p.length; i++) {
            for (int j = i+1; j < p.length; j++) {
                double v = Math.pow((p[i][0] - p[j][0]), 2) + Math.pow((p[i][1] - p[j][1]), 2);
                                if (v == 0)return false;
                set.add(v);
            }
        }
        return set.size() <= 2;
    }
}

image.png