Given the coordinates of four points in 2D space, return whether the four points could construct a square.
The coordinate (x,y) of a point is represented by an integer array with two integers.
Example:
Input: p1 = [0,0], p2 = [1,1], p3 = [1,0], p4 = [0,1] Output: True
Note:
- All the input integers are in the range [-10000, 10000].
- A valid square has four equal sides with positive length and four equal angles (90-degree angles).
- Input points have no order.
Subscribe to see which companies asked this question.
public class Solution {
public boolean validSquare(int[] p1, int[] p2, int[] p3, int[] p4) {
int[] a = helper(p1, p2, p3, p4);
int[] b = helper(p2, p1, p3, p4);
int[] c = helper(p3, p2, p1, p4);
return check(a, b) && check(a, c);
}
private int[] helper(int[] p, int[] p1, int[] p2, int[] p3) {
int[] re = new int[3];
re[0] = (p[0] - p1[0]) * (p[0] - p1[0]) + (p[1] - p1[1]) * (p[1] - p1[1]);
re[1] = (p[0] - p2[0]) * (p[0] - p2[0]) + (p[1] - p2[1]) * (p[1] - p2[1]);
re[2] = (p[0] - p3[0]) * (p[0] - p3[0]) + (p[1] - p3[1]) * (p[1] - p3[1]);
Arrays.sort(re);
return re;
}
private boolean check(int[] a, int[] b) {
boolean flag = true;
for (int i = 0; i < 3; ++i) {
if (a[i] != b[i]) {
flag = false;
break;
}
}
return flag && a[0] + a[1] == a[2] && a[0] == a[1] && a[2] != 0;
}
}
class Solution:
def validSquare(self, p1, p2, p3, p4):
a=[(p[0]-p1[0])**2+(p[1]-p1[1])**2 for p in (p2,p3,p4)]
b=[(p[0]-p2[0])**2+(p[1]-p2[1])**2 for p in (p1,p3,p4)]
c=[(p[0]-p3[0])**2+(p[1]-p3[1])**2 for p in (p1,p2,p4)]
a=sorted(a)
b=sorted(b)
c=sorted(c)
f=lambda a,b:a[0]+a[1]==a[2] and a[0]==a[1] and a==b and a[2]
return bool(f(a,b) and f(a,c))