題目描述
給定2D空間中四個點的坐标 p1, p2, p3 和 p4,如果這四個點構成一個正方形,則傳回 true 。
點的坐标 pi 表示為 [xi, yi] 。輸入 不是 按任何順序給出的。
一個 有效的正方形 有四條等邊和四個等角(90度角)。
連結:https://leetcode.cn/problems/valid-square
基本思路
正方形的一個集合特點是,任意三個點都可以組成一個等腰直角三角形,等腰直角三角形是易于判斷的,那麼我們可以按順序的選擇四個點中的三個,依次去檢測是否是等腰三角形,即可确認最後四個點是否可以組成正方形。
代碼
Golang
func validSquare(p1 []int, p2 []int, p3 []int, p4 []int) bool {
ok, len := isTriangle(p1, p2, p3, -1)
if !ok {
return false
}
ok, len = isTriangle(p4, p2, p3, len)
if !ok {
return false
}
ok, len = isTriangle(p1, p4, p3, len)
if !ok {
return false
}
ok, _ = isTriangle(p1, p2, p4, len)
return ok
}
func min(i1 int, i2 int) int {
if i1 > i2 {
return i2
}
return i1
}
func getDist(p1 []int, p2 []int) int {
return (p1[0]-p2[0])*(p1[0]-p2[0]) + (p1[1]-p2[1])*(p1[1]-p2[1])
}
func isTriangle(p1 []int, p2 []int, p3 []int, len int) (bool, int) {
l1 := getDist(p1, p2)
l2 := getDist(p2, p3)
l3 := getDist(p1, p3)
ok := l1+l2 == l3 || l1+l3 == l2 || l2+l3 == l1
if !ok {
return false, -1
}
if len == -1 {
len = min(l1, l2)
} else if len == 0 || len != min(l1, l2) {
return false, -1
}
return ok, len
}