Skip to content

Latest commit

 

History

History
49 lines (37 loc) · 1.48 KB

593.valid-square.md

File metadata and controls

49 lines (37 loc) · 1.48 KB

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

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

示例:

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

注意:

  • 所有输入整数都在 [-10000,10000] 范围内。
  • 一个有效的正方形有四个等长的正长和四个等角(90 度角)。
  • 输入点没有顺序。

正方形判定

四条边相等的是菱形,对角线也相等的是正方形

  • 每两个点算一下距离
    • 如果出现 0 肯定不是
    • 如果是正方形只有两种距离的结果,要么是边要么是对角线,且是四条边,两条对角线
      • 如果是两个等边三角形组成的菱形,会出现 4 条边和一条对角线相等,另外一条对角线不相等的情况,所以要判断是四条边,两条对角线

代码实现

class Solution {
public:
    bool validSquare(vector<int>& p1, vector<int>& p2, vector<int>& p3, vector<int>& p4) {
        unordered_map<int, int> st;
        st[getLength(p1, p2)]++;
        st[getLength(p1, p3)]++;
        st[getLength(p1, p4)]++;
        st[getLength(p2, p3)]++;
        st[getLength(p2, p4)]++;
        st[getLength(p3, p4)]++;
        return st.size() == 2 && (st.begin(0)->second == 2|| st.begin(0)->second ==4) ;
    }

    int getLength(vector<int>& p1, vector<int>& p2){
        return (p1[0] - p2[0]) * (p1[0] - p2[0]) + (p1[1] - p2[1]) * (p1[1] - p2[1]);
    }
};