解题思路:
数学方法
正方形判定定理
正方形判定定理是几何学里用于判定一个四边形是否为正方形的判定定理。判别正方形的一般顺序为先说明它是平行四边形;再说明它是菱形(或矩形);最后说明它是矩形(或菱形)。那么我们可以从枚举四边形的两条斜边入手来进行判断:
- 如果两条斜边的中点相同:则说明以该两条斜边组成的四边形为「平行四边形」。
- 在满足「条件一」的基础上,如果两条斜边的长度相同:则说明以该两条斜边组成的四边形为「矩形」。
- 在满足「条件二」的基础上,如果两条斜边的相互垂直:则说明以该两条斜边组成的四边形为「正方形」。
方法二
获取四个点两两相连构成的六条边,其中假设四条是正方形的边,两条是正方形的对角线。如果确实是正方形则六条边需满足几个条件:
- 有四条等长的短边和两条等长的长边。
- 两条短边与一条长边的组合需满足勾股定理。
注:边长均为0时不能组成正方形,需特判。
代码(方法二):
class Solution {
public:
int distance(vector<int>& p, vector<int>& q) {
return (p[0] - q[0]) * (p[0] - q[0]) + (p[1] - q[1]) * (p[1] - q[1]);
}
vector<int> getedges(vector<int>& p1, vector<int>& p2, vector<int>& p3, vector<int>& p4) {
vector<int> e;
e.push_back(distance(p1, p2));
e.push_back(distance(p1, p3));
e.push_back(distance(p1, p4));
e.push_back(distance(p2, p3));
e.push_back(distance(p2, p4));
e.push_back(distance(p3, p4));
return e;
}
bool validSquare(vector<int>& p1, vector<int>& p2, vector<int>& p3, vector<int>& p4) {
vector<int> edges = getedges(p1, p2, p3, p4);
sort(edges.begin(), edges.end(), less<int>());
if(edges[0] != edges[1]) return false;
if(edges[1] != edges[2]) return false;
if(edges[2] != edges[3]) return false;
if(edges[4] != edges[5]) return false;
if(edges[0] * 2 != edges[4] || (edges[0] == 0 && edges[4] == 0)) return false;
else return true;
}
};
时间复杂度O(1),空间复杂度O(1)。