前言说明
算法学习,日常刷题记录。
题目连接
题目内容
给定二维空间中四点的坐标,返回四点是否可以构造一个正方形。
一个点的坐标(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);
}
}
但是还没有提交,仅仅是执行代码就发现结果不对了。