593. 有效的正方形

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

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

示例:

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

输出: True

注意:

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

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

输入点没有顺序。

class Solution {
public boolean validSquare(int[] p1, int[] p2, int[] p3, int[] p4) {
// 判断标准:向量长度相等、垂直相交、对边平行,则为正方形
// 先任意选两组进行判断,确定这两组的位置,是对角线还是对边
int[] p1p2 = vector(p1, p2);
int[] p3p4 = vector(p3, p4); // 长度
if (getLength(p1p2) == 0) {
return false;
} // p1p2和p3p4:只能是垂直相交并且相等 或者 平行
if (isVerticalAndLengthEqualVector(p1p2, p3p4)) {
// p1p2, p3p4垂直 那么p1p3和p2p4必平行
if (isParallelVector(vector(p1, p3), vector(p2, p4))) {
return true;
}
} else if (isParallelVector(p1p2, p3p4)){
// p1p2, p3p4平行, 但确定不了方向,因此下面两组任意垂直且相等即可
if (isVerticalAndLengthEqualVector(vector(p1, p4), vector(p2, p3)) ||
isVerticalAndLengthEqualVector(vector(p1, p3), vector(p2, p4))) {
return true;
}
} return false;
} private int[] vector(int[] p1, int[] p2) {
return new int[]{p1[0] - p2[0], p1[1] - p2[1]};
} private double getLength(int[] p1p2) {
return Math.sqrt(p1p2[0]*p1p2[0] + p1p2[1]*p1p2[1]);
} private boolean isParallelVector(int[] p1, int[] p2) {
return p1[0]*p2[1] == p1[1]*p2[0];
} private boolean isVerticalAndLengthEqualVector(int[] p1, int[] p2) {
return p1[0]*p2[0] + p1[1]*p2[1] == 0 && getLength(p1) == getLength(p2);
}
}

最新文章

  1. JS高程5.引用类型(4)Array类型的各类方法
  2. hdu-5988 Coding Contest(费用流)
  3. cacti错误
  4. jquery ui bootstrap日期插件
  5. Spring框架学习之第8节
  6. DFS入门之二---DFS求连通块
  7. php 返回json 解析 报Wide character in print
  8. latch:library cache
  9. 如何在IIS6,7中部署ASP.NET网站(转载)
  10. scala 异常处理机制
  11. 单表ORM框架
  12. RAC 10g administration
  13. UML之时序图
  14. vector的简易实现
  15. (WCF初体验)WCF的认证和消息保护
  16. 性能超前,详解腾讯云新一代Redis缓存数据库
  17. 从0开始的Python学习008变量
  18. Clickhouse v18编译记录
  19. 流控制、FlowControl
  20. Android 音视频深入 八 小视频录制(附源码下载)

热门文章

  1. CF#358 D. Alyona and Strings DP
  2. 搜索引擎优化(SEO)
  3. 「雕爷学编程」Arduino动手做(12)——霍尔磁力模块
  4. linux常用命令---打包压缩解压
  5. day03: copy的总结(20170215)
  6. CF948B Primal Sport
  7. 【Mood】出大问题(最近很喜欢说这句话)
  8. SQL server数据库的密码策略与登录失败锁定策略
  9. Mybatis配置-简单的使用
  10. Flutter 使用Navigator进行局部跳转页面