LC 593. 有效的正方形 (opens new window) (opens new window)
中等
# 问题描述
给定 2D 空间中四个点的坐标 p1
, p2
, p3
和 p4
,如果这四个点构成一个正方形,则返回 true
。
点的坐标 pi
表示为 [xi, yi]
。输入 不是 按任何顺序给出的。
一个 有效的正方形 有四条等边和四个等角(90 度角)。
示例 1:
输入: p1 = [0,0], p2 = [1,1], p3 = [1,0], p4 = [0,1]
输出: True
示例 2:
输入:p1 = [0,0], p2 = [1,1], p3 = [1,0], p4 = [0,12]
输出:false
示例 3:
输入:p1 = [1,0], p2 = [-1,0], p3 = [0,1], p4 = [0,-1]
输出:true
提示:
p1.length == p2.length == p3.length == p4.length == 2
-104 <= xi, yi <= 104
# 几何数学
首先将四个点按指定顺序排序,然后将图形其中一个点平移到坐标原点,然后计算四条边的大小,若四条边大小相同,则判断其中一个夹角是否为 90°,判断方式可以利用向量垂直时向量点乘为 。
/**
* @param {number[]} p1
* @param {number[]} p2
* @param {number[]} p3
* @param {number[]} p4
* @return {boolean}
*/
var validSquare = function (p1, p2, p3, p4) {
;[p1, p2, p3, p4] = [p1, p2, p3, p4].sort((a, b) => a[0] - b[0] || a[1] - b[1])
p2 = [p2[0] - p1[0], p2[1] - p1[1]]
p3 = [p3[0] - p1[0], p3[1] - p1[1]]
p4 = [p4[0] - p1[0], p4[1] - p1[1]]
p1 = [0, 0]
const line1 = Math.pow(p2[1] - p1[1], 2) + Math.pow(p2[0] - p1[0], 2)
const line2 = Math.pow(p3[1] - p1[1], 2) + Math.pow(p3[0] - p1[0], 2)
const line3 = Math.pow(p4[1] - p3[1], 2) + Math.pow(p4[0] - p3[0], 2)
const line4 = Math.pow(p4[1] - p2[1], 2) + Math.pow(p4[0] - p2[0], 2)
if (line1 !== 0 && line1 === line2 && line1 === line3 && line1 === line4) {
return p2[0] * p3[0] + p2[1] * p3[1] === 0
}
return false
}
- 时间复杂度:
- 空间复杂度:
上次更新: 2023/01/31 19:48:05
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 , 转载请注明出处!