在一个二维空间中,给定四个点分别用p1、p2、p3、p4表示,如果这四个点能构成一个正方形则返回true,否则返回false。
示例1:
输入:p1=[0,0], p2=[1,1], p3=[1,0], p4=[0,1]
输出:true
这道题考察的是如何在二维空间计算边长和判断是否是直角;
下面是解题思路:
class Solution {
public boolean validSquare(int[] p1, int[] p2, int[] p3, int[] p4) {
// 有2个相等 和 4个相等
Pair pair1 = new Pair(calculate(p1, p2), 1);
Pair pair2 = new Pair(-1, 0);
try {
int p2p3 = calculate(p2, p3);
extracted(pair1, pair2, p2p3);
int p3p4 = calculate(p3, p4);
extracted(pair1, pair2, p3p4);
int p4p1 = calculate(p4, p1);
extracted(pair1, pair2, p4p1);
int p1p3 = calculate(p1, p3);
extracted(pair1, pair2, p1p3);
int p2p4 = calculate(p2, p4);
extracted(pair1, pair2, p2p4);
if (pair1.count == 2) {
return pair1.value == 2 * pair2.value;
} else if (pair1.count == 4) {
return 2 * pair1.value == pair2.value;
} else {
return false;
}
} catch (Throwable e) {
return false;
}
}
private void extracted(Pair pair1, Pair pair2, int p2p3) {
if (pair1.value == p2p3) {
pair1.count++;
} else if (pair2.value == -1 || pair2.value == p2p3) {
pair2.value = p2p3;
pair2.count++;
} else {
throw new RuntimeException();
}
}
int calculate(int[] p1, int[] p2) {
int vx = (p2[0] - p1[0]);
int vy = (p2[1] - p1[1]);
return vx * vx + vy * vy;
}
class Pair {
int value = -1;
int count;
public Pair(int value, int count) {
this.value = value;
this.count = count;
}
}
public static void main(String[] args) {
Solution solution = new Solution();
//[0,0]
//[1,1]
//[1,0]
//[0,1]
System.out.println(solution.validSquare(new int[]{0, 0}, new int[]{1, 0}, new int[]{1, 1}, new int[]{0, 1}));
System.out.println(solution.validSquare(new int[]{0, 0}, new int[]{1, 1}, new int[]{1, 0}, new int[]{0, 1}));
//[1,0]
//[-1,0]
//[0,1]
//[0,-1]
System.out.println(solution.validSquare(new int[]{1, 0}, new int[]{-1, 0}, new int[]{0, 1}, new int[]{0, -1}));
//[2,2]
//[2,1]
//[1,2]
//[1,2]
System.out.println(solution.validSquare(new int[]{2, 2}, new int[]{2, 1}, new int[]{1, 2}, new int[]{1, 2}));
}
}
这道题就是一个数学问题的考察,核心是想清楚如何计算边长,如果判断是否是直角;最终从4个点中,求出6条线段,根据6条线段找出4条边和2条对角线,最终来判断是否是一个正方形。