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

举报
兰舟千帆 发表于 2022/07/29 23:54:02 2022/07/29
【摘要】 力扣刷题之有效的正方形(每日一题7/29) 本题我采用的完全的计算暴力。 题目地址如下 链接 题目要求如下 给定2D空间中四个点的坐标 p1, p2, p3 和 p4,如果这四个点...

力扣刷题之有效的正方形(每日一题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的话,上面的要求其实是都可以满足的。

完全的对对角线的约束。

文章来源: daodaozi.blog.csdn.net,作者:兰舟千帆,版权归原作者所有,如需转载,请联系作者。

原文链接:daodaozi.blog.csdn.net/article/details/126057158

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。