题目描述
给定二维空间中四点的坐标,返回四点是否可以构造一个正方形。一个点的坐标(x,y)由一个有两个整数的整数数组表示。
注意:
- 所有输入整数都在 [-10000,10000] 范围内。
- 一个有效的正方形有四个等长的正长和四个等角(90度角)。
- 输入点没有顺序。
方法一
遍历所有的任意的两个点,正方形只边和对角线两种距离
const arr = [p1, p2, p3, p4];
const res = new Set();
// 暴力遍历任意两点的距离并存入set
for (let i = 0; i < 3; i++) {
for (let j = i + 1; j < 4; j++) {
res.add(
Math.sqrt((arr[i][0] - arr[j][0]) ** 2 + (arr[i][1] - arr[j][1]) ** 2)
);
// 注意没必要判断长距离是短距离的根号2 倍,会出现精度问题
// 任意四边形的对角线距离和边长若只有两种
// 等价于(互为充分必要)
// 这个四边形是正方形
if (res.size > 2) {
return false;
}
}
}
if (res.size !== 2) return false;
const temp = [...res];
return temp[0] > 0 && temp[1] > 0;
复杂度分析
时间复杂度:O(1)
空间复杂度:O(1)
方法二
排序后,通过相邻两边相等 且 对角线相等判断
const validSquare = function (p1, p2, p3, p4) {
// 对点进行排序
[p1, p2, p3, p4] = [p1, p2, p3, p4].sort(function (a, b) {
// x坐标不相等时,按x坐标升序。x坐标相等则按y坐标升序
return a[0] !== b[0] ? a[0] - b[0] : a[1] - b[1];
});
// 边长大于0 且 判断对角线相等 且 相邻两边相等
return distance(p1, p4) > 0 && distance(p1, p4) === distance(p2, p3) && distance(p1, p2) === distance(p1, p3);
}