目录

LC 593. 有效的正方形 (opens new window) (opens new window)

中等

# 问题描述

给定 2D 空间中四个点的坐标 p1, p2, p3p4,如果这四个点构成一个正方形,则返回 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°,判断方式可以利用向量垂直时向量点乘为 00

/**
 * @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
}
  • 时间复杂度:O(1)O(1)
  • 空间复杂度:O(1)O(1)
上次更新: 2023/01/31 19:48:05

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 , 转载请注明出处!