LeetCode - 593 有效的正方形
目录
题目来源
题目描述
示例
提示
题目解析
算法源码
数学公式求解
题目来源
593. 有效的正方形 - 力扣(LeetCode)
题目描述
给定2D空间中四个点的坐标 p1, p2, p3 和 p4,如果这四个点构成一个正方形,则返回 true 。
点的坐标 pi 表示为 [xi, yi] 。 输入没有任何顺序 。
一个 有效的正方形 有四条等边和四个等角(90度角)。
示例
输入: p1 = [0,0], p2 = [1,1], p3 = [1,0], p4 = [0,1]
输出: True
输入:p1 = [0,0], p2 = [1,1], p3 = [1,0], p4 = [0,12]
输出:false
输入: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
题目解析
假设输入的四点分别为A,B,C,D,我们可以固定A点,然后求
AB长度、AC长度、AD长度,如果四点可以组成正方形,则必然有两条边的长度相等,且另一条边的平方 = 相等的两条边的各自平方之和。
但是以上判断还不足以判定四点可以形成正方形,我们还需要保证正方形的对角线垂直,如果AB,AC相等的话,则AD就是对角线,BC也是对角线。
我们可以通过向量内积为0来判断两个向量是否垂直,因此我们可以计算
(A.x - D.x) * (B.x - C.x) + (A.y - D.y) * (B.y - C.y) === 0
来判断对角线是否垂直。
若以上条件都满足,则说明是四点可以组成正方形。
另外,我们需要处理特殊情况,比如四点中有两点或者更多的点相同,此时就无法形成四边形,更别说形成正方形了,因此我们需要排除掉这些特殊情况。
算法源码
/*** @param {number[]} p1* @param {number[]} p2* @param {number[]} p3* @param {number[]} p4* @return {boolean}*/
var validSquare = function(p1, p2, p3, p4) {const set = new Set([p1,p2,p3,p4].map(p => p[0]+' '+p[1]))if(set.size < 4) return falselet [x1, y1] = p1let [x2, y2] = p2let [x3, y3] = p3let [x4, y4] = p4let l12 = Math.pow(x2-x1, 2) + Math.pow(y2-y1,2)let l13 = Math.pow(x3-x1, 2) + Math.pow(y3-y1,2)let l14 = Math.pow(x4-x1, 2) + Math.pow(y4-y1,2)let v12 = [x2-x1, y2-y1]let v13 = [x3-x1, y3-y1]let v14 = [x4-x1, y4-y1]if(l12===l13 && l12 + l13===l14) {let v23 = [x3-x2, y3-y2]return isVertical(v14, v23)}else if(l12===l14 && l12 +l14===l13){let v24 = [x4-x2, y4-y2]return isVertical(v24, v13)}else if(l13===l14 && l13+l14===l12){let v34 = [x4-x3, y4-y3]return isVertical(v34, v12)}else {return false}
};function isVertical(v1, v2) {return v1[0]*v2[0] + v1[1]*v2[1] === 0
}
数学公式求解
具体数学公式推导请看下面文章
算法 - 正方形数量_伏城之外的博客-CSDN博客
/*** @param {number[]} p1* @param {number[]} p2* @param {number[]} p3* @param {number[]} p4* @return {boolean}*/
var validSquare = function (p1, p2, p3, p4) {let arr = [p1, p2, p3, p4];const set = new Set(arr.map((p) => p[0] + " " + p[1]));if (set.size < 4) return false;let combination = [];dfs(4, 2, 0, [], combination);let flag = false;for (let i = 0; i < combination.length; i++) {let [x1, y1] = arr[combination[i][0]];let [x2, y2] = arr[combination[i][1]];let x3 = x1 - (y1 - y2);let y3 = y1 + (x1 - x2);let x4 = x2 - (y1 - y2);let y4 = y2 + (x1 - x2);if (set.has(x3 + " " + y3) && set.has(x4 + " " + y4)) {flag = true;break;}let x5 = x1 + (y1 - y2);let y5 = y1 - (x1 - x2);let x6 = x2 + (y1 - y2);let y6 = y2 - (x1 - x2);if (set.has(x5 + " " + y5) && set.has(x6 + " " + y6)) {flag = true;break;}}return flag;
};function dfs(n, k, index, path, result) {if (path.length === k) {return result.push([...path]);}for (let i = index; i < n; i++) {path.push(i);dfs(n, k, i + 1, path, result);path.pop();}
}
LeetCode - 593 有效的正方形相关推荐
- LeetCode 593. 有效的正方形(数学)
1. 题目 给定二维空间中四点的坐标,返回四点是否可以构造一个正方形. 一个点的坐标(x,y)由一个有两个整数的整数数组表示. 示例: 输入: p1 = [0,0], p2 = [1,1], p3 = ...
- LeetCode 593. 有效的正方形
解题思路: 数学方法 正方形判定定理 正方形判定定理是几何学里用于判定一个四边形是否为正方形的判定定理.判别正方形的一般顺序为先说明它是平行四边形:再说明它是菱形(或矩形):最后说明它是矩形(或菱形) ...
- leetcode 593. Valid Square | 593. 有效的正方形(Java)
题目 https://leetcode.com/problems/valid-square/ 题解 因为顺序未知,所以可能有四种组合情况.(check时,以四个点顺时针排列为待判断的正方形) clas ...
- LeetCode 473. 火柴拼正方形(回溯)
文章目录 1. 题目 2. 解题 1. 题目 还记得童话<卖火柴的小女孩>吗?现在,你知道小女孩有多少根火柴,请找出一种能使用所有火柴拼成一个正方形的方法. 不能折断火柴,可以把火柴连接起 ...
- 【593. 有效的正方形】
来源:力扣(LeetCode) 描述: 给定2D空间中四个点的坐标 p1, p2, p3 和 p4,如果这四个点构成一个正方形,则返回 true . 点的坐标 pi 表示为 [xi, yi] .输入 ...
- [leetcode日记]221.最大正方形
题目 在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积. 示例: 输入: 1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0 输出: 4 ...
- leetcode算法题--最大正方形
原题链接:https://leetcode-cn.com/problems/maximal-square/ 动态规划: dp[i][j]以(i,j)为右下角的正方形的边长 状态转移: dp[i][j] ...
- LeetCode 473. 火柴拼正方形
473. 火柴拼正方形 还记得童话<卖火柴的小女孩>吗?现在,你知道小女孩有多少根火柴,请找出一种能使用所有火柴拼成一个正方形的方法.不能折断火柴,可以把火柴连接起来,并且每根火柴都要用到 ...
- leetcode题库221-- 最大正方形
在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积. 示例: 输入: 1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0输出: 4 思路 问 ...
最新文章
- android 截屏指定区域,Android截图 截取ContentView 截取指定的View并且保存
- AXURE RP EXTENSION For Chrome
- P3242 [HNOI2015] 接水果(整体二分、扫描线)
- 脉冲宽度调制pdm_STM32第七章-脉冲宽度调制
- Python新手输出代码
- 玩奇迹私服老是服务器维护,为什么奇迹私服进不去啊
- linux echo 当前时间,linuxecho
- saltstack 初始化LINUX系统
- 第一次创业失败的总结 - 产品设计
- python 写excel 保留空格_通过自动填充列中的空格来操作excel表的Python脚本
- 龙之谷手游微信连接授权服务器失败,龙之谷手游ios微信授权失败怎么办_龙之谷手游ios微信授权失败解决办法-66街机网...
- 领域驱动模型设计(一)
- 使用React Native可以开发Window桌面应用了!
- css html 高仿word 格式,制作的可编辑的微软Word样式文档 HTML-Sheets-of-Paper
- java随机点名器(仅供娱乐)
- 为什么onenote一直在加载_2.为什么人人都需要OneNote?
- 爬虫基础知识记录の二
- vue 分割面板组件
- ABAQUS报错:“ADJUST cannot be used for non-faceted surfaces.”
- 【无标题】灵遁者:一个好听的名字当然重要,因为这个名字代表你
热门文章
- LCMV波束形成严谨推导深入细节
- C#仿qq窗体项目 登录 注册 聊天 点赞 更换头像 添加好友 删除好友 基础功能
- 动态 | Hulu + Live TV付费订阅用户数量跃居美国第一
- jquery ie11 html函数,jQuery append()函数在IE11中失败
- 智络管+如何实现健身俱乐部的会员管理?
- JsonWebToken是什么?
- “百变”Redis带你见识不同场景下的产品技术架构 1
- Linux 基于QT的mplayer视频播放器(实现进度条的拖动、播放列表等)
- Jenkins + Jmeter 搭建简易CI (自动执行接口测试+发布web报告+发送邮件)
- mysql-yog_mysql和SQLYog工具使用