LeetCode刷题-有效的正方形

前言说明

算法学习,日常刷题记录。

题目连接

有效的正方形

题目内容

给定二维空间中四点的坐标,返回四点是否可以构造一个正方形。

一个点的坐标(x,y)由一个有两个整数的整数数组表示。

示例:

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

输出: true

注意:

所有输入整数都在 [-10000,10000] 范围内。

一个有效的正方形有四个等长的正长和四个等角(90度角)。

输入点没有顺序。

分析过程

这里展示我的做题分析过程,先想出方法1,但是方法1是错误的;后来改进为方法2,但是方法2也是错误的;然后改进为方法3,但是方法3也是错误的;接着再改进为方法4,终于正确;最后想出方法5,用另一种更加简洁的思路解决。

方法1(错误)

如果四个点能构成正方形,那么三个点就能构成三角形,所以通过勾股定理判断三个点是否能构成三角形。

求两点之间的距离,用求距离的公式:

两点距离的公式

挑选三个点的两两距离定义为p12、p13、p23,因为如果是正方形就有p23 = p14,所以转化为判断p12 ^ 2 + p13 ^ 2 = p14 ^ 2是否成立。

代码如下:

class Solution {
    public boolean validSquare(int[] p1, int[] p2, int[] p3, int[] p4) {
        // p1和p2之间的距离,根据公式,a点和b点的距离 = (a^2 + b^2)的开根号
        double p12 = Math.sqrt(Math.pow((p1[0] - p2[0]), 2) + Math.pow((p1[1] - p2[1]), 2));

        // p1和p3之间的距离
        double p13 = Math.sqrt(Math.pow((p1[0] - p3[0]), 2) + Math.pow((p1[1] - p3[1]), 2));

        // p1和p4之间的距离
        double p14 = Math.sqrt(Math.pow((p1[0] - p4[0]), 2) + Math.pow((p1[1] - p4[1]), 2));

        // 若四个点能构成正方形,那么三个点就能构成三角形,根据勾股定理,如果p12^2 + p13^2 = p23^2,那么这三点就能构成三角形,如果是正方形,那么交叉线相等,所以p14 = p23,所以p12^2 + p13^2 = p14^2,所以这里只需要判断p12^2 + p13^2 = p14^2是否成立即可,如果成立,那么四个点能构成正方形,否则不能(注意:这里的顺序可能会不同,所以要判断三种情况,有一种情况满足即可)
        return Math.pow(p12, 2) + Math.pow(p13, 2) == Math.pow(p14, 2) || Math.pow(p12, 2) + Math.pow(p14, 2) == Math.pow(p13, 2) || Math.pow(p13, 2) + Math.pow(p14, 2) == Math.pow(p12, 2);
    }
}

但是还没有提交,仅仅是执行代码就发现结果不对了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值