LeetCode 有效的正方形(图解)

给定二维空间中四点的坐标,返回四点是否可以构造一个正方形。
一个点的坐标(x,y)由一个有两个整数的整数数组表示。
示例:

输入: p1 = [0,0], p2 = [1,1], p3 = [1,0], p4 = [0,1]
输出: True

注意:

所有输入整数都在 [-10000,10000] 范围内。
一个有效的正方形有四个等长的正长和四个等角(90度角)。
输入点没有顺序。

思路分析: 如果四个点能构成正方形,则第一个点必定与另外三点中的一点成对角线,我们只要验证对角线是否满足三角形斜边即可。
LeetCode 有效的正方形(图解)

class Solution {
public:
	bool validSquare(vector<int>& p1, vector<int>& p2, vector<int>& p3, vector<int>& p4) {
        //计算p1到其他三个点的距离平方
		int disOne = distancePoint(p1, p2);
		int disTwo = distancePoint(p1, p3);
		int disThree = distancePoint(p1, p4);
		if (disOne == 0) {//防止这种输入[0,0][0,0][0,0][0,0]
			return false;
		}
		int maxDis = max(disOne, max(disTwo, disThree));//寻找最长的距离平方(正方形的斜边)
		if (maxDis == disOne) {
            //p1和p2为对角,所在边为对角线
            //disTwo != disThree第一步检测
            //2 * disTwo != maxDis第二步检测,两条斜边检测
			if (disTwo != disThree || 2 * disTwo != maxDis) {
                //检测p1、p3构成的边,p1、p4构成的边是否成直角
				return false;
			}
            //第三步检测,p1、p2所在边是否与p2、p3,p1、p3等腰直角三角形检测
			return distancePoint(p3, p4) == 2 * distancePoint(p2, p3);
		}
        //下面同上操作,寻找最长长,确定另一条对角线
		else if (maxDis == disTwo) {
			if (disOne != disThree || 2 * disOne != maxDis) {
				return false;
			}
			return distancePoint(p2, p4) == 2 * distancePoint(p2, p3);
		}
		else {
			if (disOne != disTwo || 2 * disOne != maxDis) {
				return false;
			}
			return distancePoint(p2, p3) == 2 * distancePoint(p3, p4);
		}
		return false;
	}
	//返回两个点之间距离的平方
	int distancePoint(vector<int>& p1, vector<int>& p2) {
		return (p1[0] - p2[0]) * (p1[0] - p2[0]) + (p1[1] - p2[1]) * (p1[1] - p2[1]);
	}
};

LeetCode 有效的正方形(图解)