• 593. 有效的正方形 : 简单几何运用题


    题目描述

    这是 LeetCode 上的 593. 有效的正方形 ,难度为 中等

    Tag : 「模拟」、「数学」、「计算几何」

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

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

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

    示例 1:

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

    输出: True
    • 1

    示例 2:

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

    输出:false
    • 1

    示例 3:

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

    输出:true
    • 1

    提示:

    计算几何

    根据题意进行模拟即可。

    从给定的 个顶点中选 个顶点,检查其能否形成「直角三角形」,同时保存下来首个直角三角形的直角边边长,供后续其余直角三角形进行对比(注意不能共点,即直角边长不能为 )。

    Java 代码:

    class Solution {
        long len = -1;
        public boolean validSquare(int[] a, int[] b, int[] c, int[] d) {
            return calc(a, b, c) && calc(a, b, d) && calc(a, c, d) && calc(b, c, d);
        }
        boolean calc(int[] a, int[] b, int[] c) {
            long l1 = (a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1]);
            long l2 = (a[0] - c[0]) * (a[0] - c[0]) + (a[1] - c[1]) * (a[1] - c[1]);
            long l3 = (b[0] - c[0]) * (b[0] - c[0]) + (b[1] - c[1]) * (b[1] - c[1]);
            boolean ok = (l1 == l2 && l1 + l2 == l3) || (l1 == l3 && l1 + l3 == l2) || (l2 == l3 && l2 + l3 == l1);
            if (!ok) return false;
            if (len == -1) len = Math.min(l1, l2);
            else if (len == 0 || len != Math.min(l1, l2)) return false;
            return true;
        }
    }
    • 1

    TypeScript 代码:

    let len = -1
    function validSquare(a: number[], b: number[], c: number[], d: number[]): boolean {
        len = -1
        return calc(a, b, c) && calc(a, b, d) && calc(a, c, d) && calc(b, c, d)
    };
    function calc(a: number[], b: number[], c: number[]): boolean {
        const l1 = (a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1])
        const l2 = (a[0] - c[0]) * (a[0] - c[0]) + (a[1] - c[1]) * (a[1] - c[1])
        const l3 = (b[0] - c[0]) * (b[0] - c[0]) + (b[1] - c[1]) * (b[1] - c[1])
        const ok = (l1 == l2 && l1 + l2 == l3) || (l1 == l3 && l1 + l3 == l2) || (l2 == l3 && l2 + l3 == l1)
        if (!ok) return false
        if (len == -1) len = Math.min(l1, l2)
        else if (len == 0 || len != Math.min(l1, l2)) return false
        return true
    }
    • 1
    • 时间复杂度:
    • 空间复杂度:

    最后

    这是我们「刷穿 LeetCode」系列文章的第 No.593 篇,系列开始于 2021/01/01,截止于起始日 LeetCode 上共有 1916 道题目,部分是有锁题,我们将先把所有不带锁的题目刷完。

    在这个系列文章里面,除了讲解解题思路以外,还会尽可能给出最为简洁的代码。如果涉及通解还会相应的代码模板。

    为了方便各位同学能够电脑上进行调试和提交代码,我建立了相关的仓库:https://github.com/SharingSource/LogicStack-LeetCode 。

    在仓库地址里,你可以看到系列文章的题解链接、系列文章的相应代码、LeetCode 原题链接和其他优选题解。

    更多更全更热门的「笔试/面试」相关资料可访问排版精美的 合集新基地 🎉🎉

    本文由 mdnice 多平台发布

  • 相关阅读:
    ubuntu_24.04 Noble LTS安装docker desktop启动无窗口及引擎启动失败的解决方法
    使用福禄克CFP光纤测试仪进行Tier 1和Tier 2光纤测试
    软件杯 图像识别-人脸识别与疲劳检测 - python opencv
    如何在 Ubuntu 上安装 Nagios?
    阿里云数据库MongoDB恢复到本地
    postgresql用户与权限管理
    谷歌硬件工程师年薪165万,苹果外籍员工222万,在大厂打工“香”吗?
    Kafka系列之:深入理解Predicates
    Linux下的系统编程——线程同步(十三)
    《WEB前端框架开发技术》HTML5响应式旅游景区网站——榆林子州HTML+CSS+JavaScript
  • 原文地址:https://blog.csdn.net/weixin_33243821/article/details/126050883