携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第3天,点击查看活动详情
快乐周五了,可恶的刷题依然在继续着
有效的正方形
该题出自力扣的593题 —— 有效的正方形【中等题】,这道就真的是名副其实的数学题了,不过幸好并没有涉及太深的公式
审题
给定2D空间中四个点的坐标 p1, p2, p3 和 p4,如果这四个点构成一个正方形,则返回 true 。
点的坐标 pi 表示为 [xi, yi] 。输入 不是 按任何顺序给出的。
一个 有效的正方形 有四条等边和四个等角(90度角)。
- 根据题意,其实并不复杂,就是给出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;
}
}