• 力扣刷题之有效的正方形(每日一题7/29)


    力扣刷题之有效的正方形(每日一题7/29)

    本题我采用的完全的计算暴力。

    题目地址如下
    链接

    题目要求如下

    给定2D空间中四个点的坐标 p1, p2, p3 和 p4,如果这四个点构成一个正方形,则返回 true 。
    点的坐标 pi 表示为 [xi, yi] 。输入 不是 按任何顺序给出的。
    一个 有效的正方形 有四条等边和四个等角(90度角)。
    来源:力扣(LeetCode)

    在这里插入图片描述
    在这里插入图片描述

    这是基本的要求。其实呢!提示我也没有去用,因为我采用的是完全的纯数学计算,用到了坐标的特点。比较暴力,代码快大,但是效率就是高。

    下面是我的代码

    class Solution {
        public boolean validSquare(int[] p1, int[] p2, int[] p3, int[] p4) {
               boolean result = judge_finally(p1,p2,p3,p4);
               return result;
    
        }
        public static boolean judge_finally(int[]p1,int[]p2,int[]p3,int[]p4) {
            double v_1_2 = judge_rhomb(p1, p2);//这里计算了一些可能用到的距离
            double v2_3 = judge_rhomb(p2, p3);
            double v3_4 = judge_rhomb(p3, p4);
            double v1_4 = judge_rhomb(p1, p4);
            double v_2_4 = judge_rhomb(p2, p4);
            double v_1_3 = judge_rhomb(p1, p3);
            
            //这里列出了可能构成的对角线,并作出对角线的判断,包括四点对角线中点重合,确认四边形
            //距离相等以及对角线垂直约束。这样就逐步约束为正方形
            //注意约束零点坐标,所以必须做一个约束,这里约束了对角线距离不为0
    
            if (v_1_3 == v_2_4 && v_1_3 != 0&&judge_vertical(p1, p3, p2, p4)&judge_if_line(p1,p3,p2,p4)) {
                  return true;
            }
            if (v1_4 == v2_3 && v1_4 != 0&&judge_vertical(p1, p4, p2, p3)&judge_if_line(p1,p4,p2,p3)) {
                return true;
            }
            if (v_1_2 == v3_4 && v_1_2 != 0&&judge_vertical(p1, p2, p3, p4)&judge_if_line(p1,p2,p3,p4)) {
                return true;
            }
            return  false;
    
        }
    
        public static double judge_rhomb(int[]a,int[]b)//计算两坐标构成线的长度
        {
           double x1 = ( Math.pow(a[0]-b[0],2)+Math.pow(a[1]-b[1],2));
           return  x1;
        }
    
        public static boolean judge_vertical(int[]a,int[]b,int[]c,int[]d)//判断直角
        {
            int v[] = {a[0]-b[0],a[1]-b[1]};
            int v1[] = {c[0]-d[0],c[1]-d[1]};
            return  v[0]*v1[0]+v[1]*v1[1]==0;
    
        }
        public static boolean judge_if_line(int[]a,int[]b,int[]c,int[]d)//判断四点能否构成平行四边形
            //如果四点可以构成平行四边形,则对角线中点重合
            
        {
            boolean bool_line_ = a[0] + b[0] == c[0] + d[0];
            boolean bool_line__ = a[1]+b[1]==c[1]+d[1];
            if (bool_line_&&bool_line__)
            {
                return true;
            }
            return false;
    
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59

    在这里插入图片描述
    归结方法,很基础的方法
    调用判断。这里的垂直用到了向量的特点。
    x1x2+y1y2=0,这样就可以判断是否垂直。
    对坐标四点判断是否构成平行四边形,需要判断对可能情况的对角线的中点是否重合,那么这里只要分别计算横纵坐标死否分别相等就行。
    菱形的对角线是互相垂直平分的,我们只要在让它的对角线相等,就可以判断为正方形。但是要注意做这些给出的坐标约束。所以我给了对角线长度不为0。因为如果四个点的横纵坐标都为0的话,上面的要求其实是都可以满足的。

    完全的对对角线的约束。

  • 相关阅读:
    云计算的发展趋势和挑战
    LeetCode 242.有效的字母异位词 ,349 两个数组的交集 202. 快乐数 1. 两数之和
    使用HikariCP连接池常用配置讲解及注意事项
    戏说领域驱动设计(十三)——核心架构
    Spark--经典SQL50题
    直播预告 | YashanDB 2023年度发布会正式定档11月2日,邀您共同见证国产数据库发展实践!
    python学习:集合教程
    记录“在Unity动画播放协程内等待动画播放完成时回调”遇到的坑
    切糕 小白月赛45
    线程篇(JAVA)
  • 原文地址:https://blog.csdn.net/jgdabc/article/details/126057158