LC-593 验证正方形
Posted leo-lzj
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LC-593 验证正方形相关的知识,希望对你有一定的参考价值。
问题:
给出4个点,判断这四个点能否构成一个正方形
思路:
一个正方形意味着4条边相等,四个角都为直角。我就简单地先计算p1到p2,p3,p4的三个向量,然后判断向量v2,v3,v4之间,有哪两个向量是垂直的(点积等于0)。
找出2个垂直向量之后(例如v2,v3),就判断这两个向量的长度是否相等,而且这两个向量与剩下的一个向量(v4)是否构成勾股定理。
最后,再根据向量的减法,求出剩下的点到这两个点的向量(v4 - v2和v4 - v3)与两向量(v2, v3)是否分别垂直。
这样,就可以确保有三个角是直角,而且线段相等,且对角线符合勾股定理。
这种方法的运行时间是0ms噢。
代码:
1 class Solution { 2 public: 3 bool validSquare(vector<int>& p1, vector<int>& p2, vector<int>& p3, vector<int>& p4) { 4 int v2[2], v3[2], v4[2]; 5 v2[0] = p1[0] - p2[0]; 6 v2[1] = p1[1] - p2[1]; 7 v3[0] = p1[0] - p3[0]; 8 v3[1] = p1[1] - p3[1]; 9 v4[0] = p1[0] - p4[0]; 10 v4[1] = p1[1] - p4[1]; 11 int d2 = pow(v2[0], 2) + pow(v2[1], 2); 12 int d3 = pow(v3[0], 2) + pow(v3[1], 2); 13 int d4 = pow(v4[0], 2) + pow(v4[1], 2); 14 if (d2 == 0 || d3 == 0 || d4 == 0) return false; 15 if (v2[0] * v3[0] + v2[1] * v3[1] == 0) { 16 if (d2 == d3 && d2 + d3 == d4) { 17 int dot1 = (v4[0] - v2[0]) * v2[0] + (v4[1] - v2[1]) * v2[1]; 18 int dot2 = (v4[0] - v3[0]) * v3[0] + (v4[1] - v3[1]) * v3[1]; 19 if (dot1 == 0 && dot2 == 0) 20 return true; 21 } 22 } 23 else if (v2[0] * v4[0] + v2[1] * v4[1] == 0) { 24 if (d2 == d4 && d2 + d4 == d3) { 25 int dot1 = (v3[0] - v2[0]) * v2[0] + (v3[1] - v2[1]) * v2[1]; 26 int dot2 = (v3[0] - v4[0]) * v4[0] + (v3[1] - v4[1]) * v4[1]; 27 if (dot1 == 0 && dot2 == 0) 28 return true; 29 } 30 } 31 else if (v3[0] * v4[0] + v3[1] * v4[1] == 0) { 32 if (d3 == d4 && d3 + d4 == d2) { 33 int dot1 = (v2[0] - v3[0]) * v3[0] + (v2[1] - v3[1]) * v3[1]; 34 int dot2 = (v2[0] - v4[0]) * v4[0] + (v2[1] - v4[1]) * v4[1]; 35 if (dot1 == 0 && dot2 == 0) 36 return true; 37 } 38 } 39 return false; 40 } 41 };
以上是关于LC-593 验证正方形的主要内容,如果未能解决你的问题,请参考以下文章