• 入门力扣自学笔记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°
    但从编写难易程度来说,选用边判断比较方便。

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


    代码:

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

  • 相关阅读:
    STM32F4X UCOSIII 互斥量
    如何使用Gitlab搭建属于自己的代码管理平台
    ViewPager2 PageTransformer
    电脑版WPS怎么将更新目录加到快速访问栏
    Springcloud----Nacos集群的搭建
    字符串进行 URL 编码处理
    Leetcode《图解数据结构》刷题日志【第二周】(2022/10/24-2022/10/30)
    #循循渐进学51单片机#UART串口通信#not.10
    35岁的测试工程师被炒,中年危机真的有这么可怕吗?
    python *和**的用法
  • 原文地址:https://blog.csdn.net/DK_Sorhic/article/details/126050211