【数学】有效的正方形 勾股定理

题目描述

在一个二维空间中,给定四个点分别用p1、p2、p3、p4表示,如果这四个点能构成一个正方形则返回true,否则返回false。

示例1:

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

输出:true

解题思路

这道题考察的是如何在二维空间计算边长和判断是否是直角;

下面是解题思路:

  1. 一个正方形有2条相等的对角线和4条相等的边
  2. 判断是否是直角可以使用勾股定理:C*C=A*A+B*B;在正方形中A和B相等是正方形的边,而C则是对角线。
  3. 计算2个点的长度,   长度 * 长度= (y2-y1) * (y2-y1) + (x2-x1) * (x2-x1) 
  4. 结合上述信息就可以做计算。

代码实现


class Solution {
    public boolean validSquare(int[] p1, int[] p2, int[] p3, int[] p4) {

        // 有2个相等 和 4个相等
        Pair pair1 = new Pair(calculate(p1, p2), 1);
        Pair pair2 = new Pair(-1, 0);

        try {
            int p2p3 = calculate(p2, p3);
            extracted(pair1, pair2, p2p3);

            int p3p4 = calculate(p3, p4);
            extracted(pair1, pair2, p3p4);

            int p4p1 = calculate(p4, p1);
            extracted(pair1, pair2, p4p1);

            int p1p3 = calculate(p1, p3);
            extracted(pair1, pair2, p1p3);

            int p2p4 = calculate(p2, p4);
            extracted(pair1, pair2, p2p4);

            if (pair1.count == 2) {
                return pair1.value == 2 * pair2.value;
            } else if (pair1.count == 4) {
                return 2 * pair1.value == pair2.value;
            } else {
                return false;
            }

        } catch (Throwable e) {
            return false;
        }
    }

    private void extracted(Pair pair1, Pair pair2, int p2p3) {
        if (pair1.value == p2p3) {
            pair1.count++;
        } else if (pair2.value == -1 || pair2.value == p2p3) {
            pair2.value = p2p3;
            pair2.count++;
        } else {
            throw new RuntimeException();
        }
    }

    int calculate(int[] p1, int[] p2) {
        int vx = (p2[0] - p1[0]);
        int vy = (p2[1] - p1[1]);

        return vx * vx + vy * vy;
    }

    class Pair {
        int value = -1;
        int count;

        public Pair(int value, int count) {
            this.value = value;
            this.count = count;
        }
    }


    public static void main(String[] args) {
        Solution solution = new Solution();
        //[0,0]
        //[1,1]
        //[1,0]
        //[0,1]
        System.out.println(solution.validSquare(new int[]{0, 0}, new int[]{1, 0}, new int[]{1, 1}, new int[]{0, 1}));
        System.out.println(solution.validSquare(new int[]{0, 0}, new int[]{1, 1}, new int[]{1, 0}, new int[]{0, 1}));

        //[1,0]
        //[-1,0]
        //[0,1]
        //[0,-1]
        System.out.println(solution.validSquare(new int[]{1, 0}, new int[]{-1, 0}, new int[]{0, 1}, new int[]{0, -1}));

        //[2,2]
        //[2,1]
        //[1,2]
        //[1,2]
        System.out.println(solution.validSquare(new int[]{2, 2}, new int[]{2, 1}, new int[]{1, 2}, new int[]{1, 2}));

    }
}

总结

这道题就是一个数学问题的考察,核心是想清楚如何计算边长,如果判断是否是直角;最终从4个点中,求出6条线段,根据6条线段找出4条边和2条对角线,最终来判断是否是一个正方形。

你可能感兴趣的:(算法与数据结构,算法,leetcode)