JIAKAOBO

LeetCode

venmo
wechat

感谢赞助!

  • ㊗️
  • 大家
  • offer
  • 多多!

Problem

Given the coordinates of four points in 2D space p1, p2, p3 and p4, return true if the four points construct a square.

The coordinate of a point pi is represented as [xi, yi]. The input is not given in any order.

A valid square has four equal sides with positive length and four equal angles (90-degree angles).

Example 1:

Input: p1 = [0,0], p2 = [1,1], p3 = [1,0], p4 = [0,1]
Output: true

Example 2:

Input: p1 = [0,0], p2 = [1,1], p3 = [1,0], p4 = [0,12]
Output: false

Example 3:

Input: p1 = [1,0], p2 = [-1,0], p3 = [0,1], p4 = [0,-1]
Output: true

Constraints:

  • $p1.length == p2.length == p3.length == p4.length == 2$
  • $-10^4 <= x_i, y_i <= 10^4$

Code

  1. 对角线互相垂直平分且相等的四边形是正方形
  2. 邻边相等且有一个内角是直角的平行四边形是正方形
  3. 有一组邻边相等的矩形是正方形
  4. 有一个内角是直角的菱形是正方形
  5. 对角线相等的菱形是正方形 (四条边相等的四边形是菱形)
  6. 对角线互相垂直的矩形是正方形
  7. 有三个内角为直角且有一组邻边相等的四边形是正方形

img

class Solution {
    public boolean validSquare(int[] p1, int[] p2, int[] p3, int[] p4) {
        int[][] p = {p1, p2, p3, p4};
        Arrays.sort(p, (a, b) -> a[0] == b[0] ? a[1] - b[1] : a[0] - b[0]);

        return getDist(p[0], p[1]) != 0 
        && getDist(p[0], p[1]) == getDist(p[1], p[3]) 
        && getDist(p[1], p[3]) == getDist(p[3], p[2]) 
        && getDist(p[3], p[2]) == getDist(p[2], p[0])   
        && getDist(p[0], p[3]) == getDist(p[1], p[2]);
    }

    public double getDist(int[] p1, int[] p2) {
        return (p2[1] - p1[1]) * (p2[1] - p1[1]) + (p2[0] - p1[0]) * (p2[0] - p1[0]);
    }
}