有效的正方形(LeetCode 593)

文章目录

  • 1.问题描述
  • 2.难度等级
  • 3.热门指数
  • 4.解题思路
    • 边长验证法
    • 等腰直角三角形验证法
    • 正方形定义
  • 参考文献

1.问题描述

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

点的坐标 pi 表示为 [xi, yi] 。 输入没有任何顺序 。

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

2.难度等级

Medium。

3.热门指数

★★★★☆

出题公司:腾讯。

4.解题思路

边长验证法

正方形四个点构成的六条线(四边+两对角线)有如下特征:

  • 四边长度相等
  • 边长平方和等于对角线平方

根据上面的特点,我们可以计算出任意两点之间的距离来判断是否是正方形。

注意:判断过程中,不用计算出两点实际距离,只需要算出距离的平方即可。不然会存在浮点数,可能会有精度丢失,导致结果出错。

func validSquare(p1 []int, p2 []int, p3 []int, p4 []int) bool {l1 := lenSquare(p1, p2)l2 := lenSquare(p1, p3)l3 := lenSquare(p1, p4)l4 := lenSquare(p2, p3)l5 := lenSquare(p2, p4)l6 := lenSquare(p3, p4)set := map[int]struct{}{}set[l1] = struct{}{}set[l2] = struct{}{}set[l3] = struct{}{}set[l4] = struct{}{}set[l5] = struct{}{}set[l6] = struct{}{}if len(set) != 2 {return false}var square1, square2 intfor k := range set {if square1 == 0 {square1 = kcontinue}square2 = k}if square1 < square2 {return square1*2 == square2}return square2*2 == square1
}func lenSquare(p1, p2 []int) int {x := p1[0] - p2[0]y := p1[1] - p2[1]return x*x + y*y
}

等腰直角三角形验证法

正方形可以将其拆分成四个等腰直角三角形,所以枚举由三个点构成的三角形是否时等腰直角三角形即可。

如果三角形两个边相等,则为直角边。如果直角边的平方和等于另一条边的平方,那么可断定为等腰直角三角形。

func validSquare(p1 []int, p2 []int, p3 []int, p4 []int) bool {return isosceles(p1, p2, p3) && isosceles(p1, p2, p4) && isosceles(p1, p3, p4) && isosceles(p2, p3, p4)
}// isosceles 是否等腰直角三角形
func isosceles(p1, p2, p3 []int) bool {l1 := lenSquare(p1, p2)l2 := lenSquare(p1, p3)l3 := lenSquare(p2, p3)// 边长为 0 直接返回 falseif l1 == 0 || l2 == 0 || l3 == 0 {return false}if l1 > l2 {return l1 == l2 + l3 && l2 == l3}if l2 > l3 {return l2 == l1 + l3 && l1 == l3}if l3 > l1 {return l3 == l1 + l2 && l1 == l2}return false
}func lenSquare(p1, p2 []int) int {x := p1[0] - p2[0]y := p1[1] - p2[1]return x*x + y*y
}

正方形定义

正方形是特殊的平行四边形。

对角线相等且垂直的平行四边形是正方形。

  • 如果两条对角线的中点相同,则说明四边形为「平行四边形」。
  • 在满足「条件一」的基础上,如果两条对角线长度相同,则说明四边形为「矩形」。
  • 在满足「条件二」的基础上,如果两条对角线相互垂直,则说明四边形为「正方形」。
func checkLength(v1, v2 []int) bool {return v1[0]*v1[0]+v1[1]*v1[1] == v2[0]*v2[0]+v2[1]*v2[1]
}func checkMidPoint(p1, p2, p3, p4 []int) bool {return p1[0]+p2[0] == p3[0]+p4[0] && p1[1]+p2[1] == p3[1]+p4[1]
}func calCos(v1, v2 []int) int {return v1[0]*v2[0] + v1[1]*v2[1]
}func help(p1, p2, p3, p4 []int) bool {v1 := []int{p1[0] - p2[0], p1[1] - p2[1]}v2 := []int{p3[0] - p4[0], p3[1] - p4[1]}return checkMidPoint(p1, p2, p3, p4) && checkLength(v1, v2) && calCos(v1, v2) == 0
}func validSquare(p1, p2, p3, p4 []int) bool {// p1 和 p2 为同一个点if p1[0] == p2[0] && p1[1] == p2[1] {return false}// p1 与 p2 构成对角线if help(p1, p2, p3, p4) {return true}// p1 和 p3 为同一个点if p1[0] == p3[0] && p1[1] == p3[1] {return false}// p1 与 p3 构成对角线if help(p1, p3, p2, p4) {return true}// p1 和 p4 为同一个点if p1[0] == p4[0] && p1[1] == p4[1] {return false}// p1 与 p4 构成对角线if help(p1, p4, p2, p3) {return true}return false
}

参考文献

593. 有效的正方形 - LeetCode

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/745944.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【开源-土拨鼠充电系统】鸿蒙 HarmonyOS 4.0+微信小程序+云平台

本人自己开发的开源项目&#xff1a;土拨鼠充电系统 ✍GitHub开源项目地址&#x1f449;&#xff1a;https://github.com/cheinlu/groundhog-charging-system ✍Gitee开源项目地址&#x1f449;&#xff1a;https://gitee.com/cheinlu/groundhog-charging-system ✨踩坑不易&am…

192基于matlab的雷达信号进行RD图的仿真

基于matlab的雷达信号进行RD图的仿真&#xff0c;在距离进行匹配滤波&#xff0c;具体方法是与回波信号的FFT与参考信号对称共轭的FFT相乘&#xff0c;再IFFT。在多普勒维通过多普勒滤波器组进行滤波&#xff0c;相当于进行FFT。程序已调通&#xff0c;可直接运行。 192 matlab…

牛客小白月赛60-C-小竹关禁闭

很经典的dp问题 对于求解动态规划类的问题,关键就是阶段,状态,决策,状态转移方程 本题的核心点就是,怎么找到上一个状态 dp[i] max(dp[i -1],dp[i - k - 1] a[i]) 当前点不选,它的上一个状态就是i - 1 当前点如果选,它的上一个状态是i - k - 1 关键就是它对应的上一个状…

Elasticsearch:使用标记修剪提高文本扩展性能

作者&#xff1a;来自 Elastic Kathleen DeRusso 本博客讨论了 ELSER 性能的令人兴奋的新增强功能&#xff0c;该增强功能即将在 Elasticsearch 的下一版本中推出&#xff01; 标记&#xff08;token&#xff09;修剪背后的策略 我们已经详细讨论了 Elasticsearch 中的词汇和…

C#十大排序总结

一、冒泡排序 传送门 一、C#冒泡排序算法-CSDN博客 未完待续。。。

CS架构和BS架构

在软件开发领域&#xff0c;CS架构和BS架构是两种常见的架构模式&#xff0c;用于描述客户端和服务器之间的交互方式。这两种架构模式分别代表Client/Server架构和Browser/Server架构。 CS架构&#xff08;Client/Server架构&#xff09;&#xff1a; 客户端&#xff08;Client…

测试用例执行计划(100%用例) C卷(JavaPythonC++Node.jsC语言)

某个产品当前迭代周期内有N个特性({F1,F2,., })需要进行覆盖测试,每个特性都被评估了对应的优先级,特性使用其ID作为下标进行标识。 设计了M个测试用例({T1,T2.……,Tm}),每个用例对应了一个覆盖特性的集合,测试用例使用其ID作为下标进行标识,测试用例的优先级定义为其覆盖…

KY211 特殊排序

描述&#xff1a; 输入一系列整数&#xff0c;将其中最大的数挑出(如果有多个&#xff0c;则挑出一个即可)&#xff0c;并将剩下的数进行排序&#xff0c;如果无剩余的数&#xff0c;则输出-1。 输入描述&#xff1a; 输入第一行包括1个整数N&#xff0c;1<N<1000&#x…

公式排序算法实际运用

试想下这个么个场景&#xff1a;用户可以自己配置多个公式&#xff0c;公式与公式之间又有依赖关系。比如ABC &#xff0c;BCD。需要做个算法来排序这些公式。实际我们可以分为两个步骤来看这个问题。 1&#xff0c;配置的公式之间不能死循环依赖。比如ABC ,BAC。这种A依赖…

Landsat、哨兵等免费数据下载地址汇总

我们科研和一些工程化应用中&#xff0c;经常会用到免费的Landsat、哨兵1/2/3等数据。下面介绍常用的下载网址&#xff1a; 1.哨兵系列数据 哨兵系列数据在https://scihub.copernicus.eu/dhus 上简单注册一个用户就可以下载&#xff0c;就是速度慢点&#xff0c;还限制一个用…

如何查看并详细了解一个R包

查看并拆解一个R包&#xff0c;如ggplot2&#xff0c;是一种深入了解其功能和内部工作原理的好方法。这个过程可以帮助你更好地理解包的结构&#xff0c;使用方式&#xff0c;以及如何扩展或修改其功能以满足你的需求。以下是一些基本步骤和技巧&#xff0c;以ggplot2为例进行解…

vue2——new Vue({router,store, render: h => h(App) }).$mount(‘#app‘);分析

router render: h > h(App) 是下面内容的缩写&#xff1a; render: function (createElement) {return createElement(App); } 进一步缩写为(ES6 语法)&#xff1a; render (createElement) {return createElement(App); } 再进一步缩写为&#xff1a; render (h){retur…

Linux第77步_处理Linux并发的相关函数

了解linux中的“原子整形数据”操作、“原子位数据”操作、自旋锁、读写锁、顺序锁、信号量和互斥体&#xff0c;以及相关函数。 并发就是多个“用户”同时访问同一个共享资源。如&#xff1a;多个线程同时要求读写同一个EEPROM芯片&#xff0c;这个EEPROM就是共享资源&#x…

【数学建模】线性规划

针对未来可能的数学建模比赛内容&#xff0c;我对学习的内容做了一些调整&#xff0c;所以先跳过灰色关联分析和模糊综合评价的代码&#xff0c;今天先来了解一下运筹规划类——线性规划模型。 背景&#xff1a; 某数学建模游戏有三种题型&#xff0c;分别是A&#xff0c;B&am…

远程办公、企业内网服务器的Code-Server上如何配置使用CodeGeeX插件

很多小伙伴都会在工作中使用code-server&#xff0c;比如说远程办公&#xff0c;当你需要在家访问你的工作环境&#xff0c;亦或者是你们公司的Docker是放入服务器中。code-server 无疑是最好的选择&#xff0c;它可以让你通过互联网安全地连接到远程服务器上的开发环境并且使用…

【保姆级】GPT的Oops问题快速解决方案

GPT的"Oops"问题通常指的是GPT在处理请求时突然遇到错误或无法提供预期输出的情况。要快速解决这个问题&#xff0c;可以尝试以下分步策略&#xff1a; 确认问题范围&#xff1a; 首先&#xff0c;确认问题是偶发的还是持续存在的。如果是偶发的&#xff0c;可能是临…

【Python】【os.path】【pathlib】告别os.path,拥抱pathlib

目录 1. os.path VS pathlib 1.1. 路径规范化 1.2. 字符串和对象 1.3. 读写文件 2. pathlib的性能 3. 总结 pathlib 模块是在Python3.4版本中首次被引入到标准库中的&#xff0c;作为一个可选模块。 从Python3.6开始&#xff0c;内置的 open 函数以及 os 、 shutil 和 os…

环境安装篇 之 Kind 搭建 kubernetes 测试集群

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 环境安装 系列文章&#xff0c;介绍 使用Kind工具 快速安装 kubernetes 测试集群的详细步骤 1.Kind简介 Kind 是一个使用 Docker 容器“节点”运行本地 Kubernetes 集群的工具。Kind 主要用于测试kubernetes本…

微博热搜榜单采集,微博热搜榜单爬虫,微博热搜榜单解析,完整代码(话题榜+热搜榜+文娱榜和要闻榜)

文章目录 代码1. 话题榜2. 热搜榜3. 文娱榜和要闻榜 过程1. 话题榜2. 热搜榜3. 文娱榜和要闻榜 代码 1. 话题榜 import requests import pandas as pd import urllib from urllib import parse headers { authority: weibo.com, accept: application/json, text/pl…

win10磁盘删除卷里面数据怎么恢复 win10磁盘删除卷怎么恢复

大家好&#xff0c;我是你们的小助手&#xff0c;今天我们来聊一下一个非常重要的话题——win10磁盘删除卷里面数据怎么恢复&#xff1f;相信很多小伙伴都曾经遇到过这种情况&#xff0c;不小心把重要的文件删掉了&#xff0c;或者格式化了整个磁盘&#xff0c;导致数据丢失。那…