返回

以 leetcode 593 题为例,解密有效正方形的证明思路

前端

揭秘正方形之谜:深入浅出探秘 LeetCode 593 题

检查对角线:

在寻找一个正方形时,对角线是至关重要的线索。首先,我们需要确保两条对角线相等。这并不难,只需计算两条对角线之间的距离,如果它们相同,我们就可以继续下一步。

接下来,我们还需要确保这两条对角线互相垂直。这稍微复杂一些,但我们仍然可以使用基本的几何原理。如果两条对角线垂直,那么形成的四个三角形将是直角三角形。直角三角形的两个短边长度之和等于较长边(对角线)的长度。我们可以分别检查每个三角形,如果它们都满足这个条件,那么对角线就是垂直的。

验证边长:

下一步,我们必须检查这四个边的长度是否相等。如果有一个边与其他三个边不同,那么就不可能形成一个正方形。幸运的是,我们可以轻松地计算出每条边的长度,如果它们都相等,那么我们就可以继续下一步。

测量对角线:

最后,我们需要检查对角线长度是否满足一个特殊的条件。在正方形中,对角线长度等于边长乘以根号 2。如果对角线长度不满足这个条件,那么我们就不可能有一个正方形。

代码示例:

public boolean isValidSquare(int[] p1, int[] p2, int[] p3, int[] p4) {
    // 检查对角线相等且互相垂直
    double d1 = Math.sqrt((p2[0] - p1[0]) * (p2[0] - p1[0]) + (p2[1] - p1[1]) * (p2[1] - p1[1]));
    double d2 = Math.sqrt((p3[0] - p4[0]) * (p3[0] - p4[0]) + (p3[1] - p4[1]) * (p3[1] - p4[1]));
    if (d1 != d2) {
        return false;
    }
    if (p2[0] - p1[0] == 0 || p3[0] - p4[0] == 0) {
        return false;
    }
    if ((p2[1] - p1[1]) / (p2[0] - p1[0]) == (p4[1] - p3[1]) / (p4[0] - p3[0])) {
        return false;
    }

    // 检查边长
    double side1 = Math.sqrt((p2[0] - p1[0]) * (p2[0] - p1[0]) + (p2[1] - p1[1]) * (p2[1] - p1[1]));
    double side2 = Math.sqrt((p3[0] - p2[0]) * (p3[0] - p2[0]) + (p3[1] - p2[1]) * (p3[1] - p2[1]));
    double side3 = Math.sqrt((p4[0] - p3[0]) * (p4[0] - p3[0]) + (p4[1] - p3[1]) * (p4[1] - p3[1]));
    double side4 = Math.sqrt((p1[0] - p4[0]) * (p1[0] - p4[0]) + (p1[1] - p4[1]) * (p1[1] - p4[1]));
    if (side1 != side2 || side2 != side3 || side3 != side4) {
        return false;
    }

    // 检查对角线长度
    if (d1 != side1 * Math.sqrt(2)) {
        return false;
    }

    return true;
}

常见问题解答:

  1. 什么是正方形的特殊之处?

    • 正方形是四边形,其四个边相等,四个角都是直角。
  2. 如何判断四个点是否能形成正方形?

    • 检查对角线是否相等且互相垂直,然后检查边长是否相等,最后检查对角线长度是否满足一个特殊条件。
  3. 为什么对角线在判断正方形时如此重要?

    • 对角线将正方形分成四个直角三角形,这些三角形的性质可以帮助我们确定正方形的形状。
  4. 如果一个四边形具有三个直角,它一定是正方形吗?

    • 不一定,四边形可能有三个直角,但如果它的四边不等,就不是正方形。
  5. 除了上述方法之外,还有其他方法可以判断四个点是否能形成正方形吗?

    • 有,我们可以计算每条边的坡度,如果所有四条边的坡度相等,那么这四个点可以形成一个正方形。