有效的回旋镖

简介: 🎈每天进行一道算法题目练习,今天的题目是“有效的回旋镖”。

说在前面

🎈每天进行一道算法题目练习,今天的题目是“有效的回旋镖”。

问题描述

给定一个数组 points ,其中 points[i] = [xi, yi] 表示 X-Y 平面上的一个点,如果这些点构成一个 回旋镖 则返回 true 。\
回旋镖 定义为一组三个点,这些点 各不相同 且 不在一条直线上 。

示例 1:

输入:points = [[1,1],[2,3],[3,2]]
输出:true

示例 2:

输入:points = [[1,1],[2,2],[3,3]]
输出:false

提示:

points.length == 3
points[i].length == 2
0 <= xi, yi <= 100

思路分析

阅读完题目之后,我们可以知道题目的意思:给我们三个点,我们需要判断这三个点是否满足以下条件:

  • 1、三个点各不相同;
  • 2、三个点不在一条直线上。

所以我们最直接的做法就是直接按照题目要求的条件对三个点进行判断即可。\
当然我们也还有其他做法:\
我们都知道3个不共线的点可以组成一个三角形,那么我们是不是也可以根据三角形的相关性质和公式来进行解题呢?\
还有我们可以使用高中都学过的知识:向量叉乘也可以帮助我们完成这道题目。\
具体代码在后面,我们继续往下看。

AC代码

1、暴力法

直接的做法就是直接按照题目要求的条件对三个点进行判断即可。

  • 1、三个点各不相同;

先对给出的点列表排序,判断相邻的点是否重合。

  • 2、三个点不在一条直线上。

判断相邻两个点组成的直线斜率是否相等。

/**
 * @param {number[][]} points
 * @return {boolean}
 */
var isBoomerang = function(points) {
    const p = points.sort((a,b)=>{
        return a[0] == b[0] ? (a[1] - b[1]) : (a[0] - b[0]);
    });
    if((p[0][0] == p[1][0] && p[0][1] == p[1][1]) || (p[1][0] == p[2][0] && p[1][1] == p[2][1])) return false;
    return !((p[0][1] - p[1][1]) * (p[1][0] - p[2][0]) == (p[1][1] - p[2][1]) * (p[0][0] - p[1][0])) 
};

2、向量叉乘法

我们可以将3个点分别看成p1、p2、p3,可以将(p2-p1)看成向量v1,将(p3 - p2)看成向量v2,三点各不相同且不在一条直线上等价于这两个向量的叉乘结果不为零。
二维向量叉乘公式a(x1,y1),b(x2,y2),则 a × b=(x1 y2 - x2 y1)。

/**
 * @param {number[][]} points
 * @return {boolean}
 */
var isBoomerang = function(points) {
    const v1 = [points[1][0] - points[0][0], points[1][1] - points[0][1]];
    const v2 = [points[2][0] - points[1][0], points[2][1] - points[1][1]];
    return v1[0] * v2[1] - v1[1] * v2[0] != 0;
};

3、三角形相关公式

设三个点A、B、C的坐标分别为A(x1,y1)、B(x2,y2)、C(x3、y3)

那么A、B、C三点可围成一个三角形。AC与AB边的夹角为∠A。

那么向量AB=(x2-x1,y2-y1)、向量AC=(x3-x1,y3-y1)

令向量AB=a,向量AC=b

则根据向量运算法则可得,

|a·b|=|a|·|b|·|cosA|

那么cosA=|a·b|/(|a|·|b|),则sinA=√((|a|·|b|)^2-(|a·b|)^2)/(|a|·|b|)

那么三角形的面积S=|a|·|b|·sinA=√((|a|·|b|)^2-(|a·b|)^2)

a·b=(x2-x1)*(x3-x1)+(y2-y1)*(y3-y1)

那么可得三角形的面积S=(x1y2-x1y3+x2y3-x2y1+x3y1-x2y2)

/**
 * @param {number[][]} points
 * @return {boolean}
 */
var isBoomerang = function(points) {
    return (p[0][0] * (p[1][1] - p[2][1]) + p[1][0] * (p[2][1] - p[0][1]) + p[2][0] * (p[0][1] - p[1][1])) != 0;
};

说在后面

🎉这里是 JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打打羽毛球🏸 ,平时也喜欢写些东西,既为自己记录📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解🙇,写错的地方望指出,定会认真改进😊,在此谢谢大家的支持,我们下文再见🙌。
目录
相关文章
|
4天前
|
弹性计算 安全 API
访问控制(RAM)|云上安全使用AccessKey的最佳实践
集中管控AK/SK的生命周期,可以极大降低AK/SK管理和使用成本,同时通过加密和轮转的方式,保证AK/SK的安全使用,本次分享为您介绍产品原理,以及具体的使用步骤。
101780 0
|
4天前
|
SQL 关系型数据库 分布式数据库
Doodle Jump — 使用Flutter&Flame开发游戏真不错!
用Flutter&Flame开发游戏是一种什么体验?最近网上冲浪的时候,我偶然发现了一个国外的游戏网站,类似于国内的4399。在浏览时,我遇到了一款经典的小游戏:Doodle Jump...
|
11天前
|
弹性计算 运维 安全
访问控制(RAM)|云上程序使用临时凭证的最佳实践
STS临时访问凭证是阿里云提供的一种临时访问权限管理服务,通过STS获取可以自定义时效和访问权限的临时身份凭证,减少长期访问密钥(AccessKey)泄露的风险。本文将为您介绍产品原理,以及具体的使用步骤。
151032 4
|
10天前
|
数据采集 存储 运维
提升团队工程交付能力,从“看见”工程活动和研发模式开始
本文从统一工程交付的概念模型开始,介绍了如何将应用交付的模式显式地定义出来,并通过工具平台落地。
119990 57
|
10天前
|
监控 负载均衡 Java
深入探究Java微服务架构:Spring Cloud概论
**摘要:** 本文深入探讨了Java微服务架构中的Spring Cloud,解释了微服务架构如何解决传统单体架构的局限性,如松耦合、独立部署、可伸缩性和容错性。Spring Cloud作为一个基于Spring Boot的开源框架,提供了服务注册与发现、负载均衡、断路器、配置中心、API网关等组件,简化了微服务的开发、部署和管理。文章详细介绍了Spring Cloud的核心模块,如Eureka、Ribbon、Hystrix、Config、Zuul和Sleuth,并通过一个电商微服务系统的实战案例展示了如何使用Spring Cloud构建微服务应用。
103498 8
|
11天前
|
人工智能 Serverless 对象存储
让你的文档从静态展示到一键部署可操作验证
通过函数计算的能力让阿里云的文档从静态展示升级为动态可操作验证,用户在文档中单击一键部署可快速完成代码的部署及测试。这一改变已在函数计算的活动沙龙中得到用户的认可。
120814 215
|
11天前
|
SQL 存储 数据可视化
Ganos H3地理网格能力解析与最佳实践
本文介绍了Ganos H3的相关功能,帮助读者快速了解Ganos地理网格的重要特性与应用实践。H3是Uber研发的一种覆盖全球表面的二维地理网格,采用了一种全球统一的、多层次的六边形网格体系来表示地球表面,这种地理网格技术在诸多业务场景中得到广泛应用。Ganos不仅提供了H3网格的全套功能,还支持与其它Ganos时空数据类型进行跨模联合分析,极大程度提升了客户对于时空数据的挖掘分析能力。
|
11天前
|
存储 缓存 安全
深度解析JVM世界:JVM内存结构
深度解析JVM世界:JVM内存结构
|
18天前
|
人工智能 编解码 对象存储
一键生成视频!用 PAI-EAS 部署 AI 视频生成模型 SVD 工作流
本教程将带领大家免费领取阿里云PAI-EAS的免费试用资源,并且带领大家在 ComfyUI 环境下使用 SVD的模型,根据任何图片生成一个小短视频。