593. Valid Square

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
  • -104 <= xi, yi <= 104

Rust Solution

struct Solution;

use std::collections::HashSet;

macro_rules! d {
    ($a:expr, $b:expr) => {
        ($a[0] - $b[0]) * ($a[0] - $b[0]) + ($a[1] - $b[1]) * ($a[1] - $b[1])
    };
}

type Point = Vec<i32>;

impl Solution {
    fn valid_square(p1: Point, p2: Point, p3: Point, p4: Point) -> bool {
        let mut hs: HashSet<i32> = HashSet::new();
        let v: Vec<Point> = vec![p1, p2, p3, p4];
        for i in 0..4 {
            for j in i + 1..4 {
                hs.insert(d!(v[i], v[j]));
            }
        }
        hs.len() == 2 && !hs.contains(&0)
    }
}

#[test]
fn test() {
    let p1 = vec![0, 0];
    let p2 = vec![1, 1];
    let p3 = vec![1, 0];
    let p4 = vec![0, 1];
    let res = true;
    assert_eq!(Solution::valid_square(p1, p2, p3, p4), res);
    let p1 = vec![0, 0];
    let p2 = vec![1, 1];
    let p3 = vec![0, 0];
    let p4 = vec![0, 0];
    let res = false;
    assert_eq!(Solution::valid_square(p1, p2, p3, p4), res);
}

Having problems with this solution? Click here to submit an issue on github.