Geometry Math
Description 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 Solutions Solution 1 Thinking
Four points form a square if the sides are equal and adjacent sides are perpendicular — equivalently, every triple is an isosceles right triangle. Testing permutations of a quadrilateral is messy.
For each triple, check that two squared sides are equal and the Pythagorean identity holds, rejecting zero length. If all four triples pass, the points form a square.
Python3 Java C++ Go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 class Solution :
def validSquare (
self , p1 : List [ int ], p2 : List [ int ], p3 : List [ int ], p4 : List [ int ]
) -> bool :
def check ( a , b , c ):
( x1 , y1 ), ( x2 , y2 ), ( x3 , y3 ) = a , b , c
d1 = ( x1 - x2 ) * ( x1 - x2 ) + ( y1 - y2 ) * ( y1 - y2 )
d2 = ( x1 - x3 ) * ( x1 - x3 ) + ( y1 - y3 ) * ( y1 - y3 )
d3 = ( x2 - x3 ) * ( x2 - x3 ) + ( y2 - y3 ) * ( y2 - y3 )
return any (
[
d1 == d2 and d1 + d2 == d3 and d1 ,
d2 == d3 and d2 + d3 == d1 and d2 ,
d1 == d3 and d1 + d3 == d2 and d1 ,
]
)
return (
check ( p1 , p2 , p3 )
and check ( p2 , p3 , p4 )
and check ( p1 , p3 , p4 )
and check ( p1 , p2 , p4 )
)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 class Solution {
public boolean validSquare ( int [] p1 , int [] p2 , int [] p3 , int [] p4 ) {
return check ( p1 , p2 , p3 ) && check ( p1 , p3 , p4 ) && check ( p1 , p2 , p4 ) && check ( p2 , p3 , p4 );
}
private boolean check ( int [] a , int [] b , int [] c ) {
int x1 = a [ 0 ] , y1 = a [ 1 ] ;
int x2 = b [ 0 ] , y2 = b [ 1 ] ;
int x3 = c [ 0 ] , y3 = c [ 1 ] ;
int d1 = ( x1 - x2 ) * ( x1 - x2 ) + ( y1 - y2 ) * ( y1 - y2 );
int d2 = ( x1 - x3 ) * ( x1 - x3 ) + ( y1 - y3 ) * ( y1 - y3 );
int d3 = ( x2 - x3 ) * ( x2 - x3 ) + ( y2 - y3 ) * ( y2 - y3 );
if ( d1 == d2 && d1 + d2 == d3 && d1 > 0 ) {
return true ;
}
if ( d1 == d3 && d1 + d3 == d2 && d1 > 0 ) {
return true ;
}
if ( d2 == d3 && d2 + d3 == d1 && d2 > 0 ) {
return true ;
}
return false ;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 class Solution {
public :
bool validSquare ( vector < int >& p1 , vector < int >& p2 , vector < int >& p3 , vector < int >& p4 ) {
return check ( p1 , p2 , p3 ) && check ( p1 , p3 , p4 ) && check ( p1 , p2 , p4 ) && check ( p2 , p3 , p4 );
}
bool check ( vector < int >& a , vector < int >& b , vector < int >& c ) {
int x1 = a [ 0 ], y1 = a [ 1 ];
int x2 = b [ 0 ], y2 = b [ 1 ];
int x3 = c [ 0 ], y3 = c [ 1 ];
int d1 = ( x1 - x2 ) * ( x1 - x2 ) + ( y1 - y2 ) * ( y1 - y2 );
int d2 = ( x1 - x3 ) * ( x1 - x3 ) + ( y1 - y3 ) * ( y1 - y3 );
int d3 = ( x2 - x3 ) * ( x2 - x3 ) + ( y2 - y3 ) * ( y2 - y3 );
if ( d1 == d2 && d1 + d2 == d3 && d1 > 0 ) return true ;
if ( d1 == d3 && d1 + d3 == d2 && d1 > 0 ) return true ;
if ( d2 == d3 && d2 + d3 == d1 && d2 > 0 ) return true ;
return false ;
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 func validSquare ( p1 [] int , p2 [] int , p3 [] int , p4 [] int ) bool {
check := func ( a , b , c [] int ) bool {
x1 , y1 := a [ 0 ], a [ 1 ]
x2 , y2 := b [ 0 ], b [ 1 ]
x3 , y3 := c [ 0 ], c [ 1 ]
d1 := ( x1 - x2 ) * ( x1 - x2 ) + ( y1 - y2 ) * ( y1 - y2 )
d2 := ( x1 - x3 ) * ( x1 - x3 ) + ( y1 - y3 ) * ( y1 - y3 )
d3 := ( x2 - x3 ) * ( x2 - x3 ) + ( y2 - y3 ) * ( y2 - y3 )
if d1 == d2 && d1 + d2 == d3 && d1 > 0 {
return true
}
if d1 == d3 && d1 + d3 == d2 && d1 > 0 {
return true
}
if d2 == d3 && d2 + d3 == d1 && d2 > 0 {
return true
}
return false
}
return check ( p1 , p2 , p3 ) && check ( p1 , p3 , p4 ) && check ( p1 , p2 , p4 ) && check ( p2 , p3 , p4 )
}
GitHub