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.
Solution:
思路:
判斷四個(gè)角是否是直角,但即便四個(gè)角都是直角,也不能說(shuō)明一定就是正方形,還有可能是矩形。還得判斷各邊是否相等。
其實(shí)可以?xún)H通過(guò)邊的關(guān)系的來(lái)判斷是否是正方形,根據(jù)初中幾何的知識(shí)我們知道正方形的四條邊相等,兩條對(duì)角線相等,滿(mǎn)足這兩個(gè)條件的四邊形一定是正方形。
我們只需要對(duì)四個(gè)點(diǎn),兩兩之間算距離,如果計(jì)算出某兩個(gè)點(diǎn)之間距離為0,說(shuō)明兩點(diǎn)重合了,直接返回false,如果不為0,那么我們就建立距離和其出現(xiàn)次數(shù)之間的映射,最后如果我們只得到了兩個(gè)不同的距離長(zhǎng)度,那么就說(shuō)明是正方形了.
Time Complexity: O() Space Complexity: O()
Solution Code:
class Solution {
public boolean validSquare(int[] p1, int[] p2, int[] p3, int[] p4) {
long[] lengths = {dist(p1, p2), dist(p2, p3), dist(p3, p4),
dist(p4, p1), dist(p1, p3), dist(p2, p4)}; // all 6 sides
long max = 0, nonMax = 0;
for(long len : lengths) {
max = Math.max(max, len);
}
int count = 0;
for(int i = 0; i < lengths.length; i++) {
if(lengths[i] == max) count++;
else nonMax = lengths[i]; // non diagonal side.
}
if(count != 2) return false; // diagonals lengths have to be same.
for(long len : lengths) {
if(len != max && len != nonMax) return false; // sides have to be same length
}
return true;
}
private long dist(int[] p1, int[] p2) {
return (long)Math.pow(p1[0] - p2[0], 2) + (long)Math.pow(p1[1] - p2[1], 2);
}
}