入门力扣自学笔记107 C++ (题目编号593)

593. 有效的正方形

题目:

给定2D空间中四个点的坐标 p1, p2, p3 和 p4,如果这四个点构成一个正方形,则返回 true 。

点的坐标 pi 表示为 [xi, yi] 。输入 不是 按任何顺序给出的。

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


示例 1:

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


示例 2:

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


示例 3:

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


提示:

p1.length == p2.length == p3.length == p4.length == 2
-104 <= xi, yi <= 104


来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/valid-square
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


思路:

为了简化解题步骤,应该只针对一种属性进行判断。

从边来说,四边相等且两对角线相等且对角线长为边长的/sqrt{2}倍
从角来说,四边夹角与两对角线夹角均为90°
但从编写难易程度来说,选用边判断比较方便。

既是菱形又是矩形的图形是正方形,菱形的四条边相等,矩形对角线相等,那么只要求出六条边的长度即可。


代码:

class Solution {
public:
    static bool validSquare(vector& p1, vector& p2, vector& p3, vector& p4)
    {
        map lengths;                    /*以长度为key,该长度出现的次数为value*/
        int longest = INT_MIN, shortest = INT_MAX;     
        vector> edges;   /*方便求边长的简单处理*/
        edges.emplace_back(p1);
        edges.emplace_back(p2);
        edges.emplace_back(p3);
        edges.emplace_back(p4);
        for (int i = 0; i < 3; ++i)
            for (int j = i + 1; j < 4; ++j)        
            {
                int x_diff = edges[i][0] - edges[j][0];      /*求横坐标的差*/
                int y_diff = edges[i][1] - edges[j][1];      /*求纵坐标的差*/
                int length = abs(x_diff * x_diff) + abs(y_diff * y_diff);    /*为了避免精度问题,这里取距离的平方*/
                longest = max(longest, length);             /*保存可能的对角线长*/
                shortest = min(shortest, length);       /*保存可能的边长*/
                ++lengths[length];
            }
        if (lengths[shortest] == 4 && lengths[longest] == 2 && longest== 2 * shortest) return true;   
                    /*只有四边相等&&两对角线相等&&对角线长度平方为边长平方之两倍时,才是正方形*/
        else return false;
    }
};

你可能感兴趣的:(力扣算法学习,c++,leetcode,算法)