【我也想刷穿 LeetCode啊】1037. 有效的回旋镖

69 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第26天,点击查看活动详情

现在前端很多岗位面试需要有一定的算法基础,或者说经常刷算法的会优先考虑。

因此每天刷刷LeetCode非常有必要

在这之前我也刷过一些算法题,也希望以后也坚持刷,跟某掘友一样,我也想刷穿 LeetCode

一、题目描述

给定一个数组 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

来源:力扣(LeetCode) 链接:leetcode.cn/problems/va… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、思路分析

已知平面上的三个点A(x1,y1)、B(x2,y2)、C(x3,y3),求判断它们是否在一条直线上?

方法一:判断向量AB和向量AC的斜率是否相等。即(y2 - y1)/(x2 - x1) == (y3 - y1)/(x3 - x1).为了防止除数为零的问题可以把这个判断转成乘法:(y3 - y1) * (x2 - x1) - (y2 - y1) * (x3 - x1)==0

方法二: 判断三角形ABC的面积S然后判断S是否为0(可以通过行列式求三角形面积或者海伦公式求三角形面积,具体原理百度一下)

行列式: S = (1/2) * (x1 * y2 + x2y3 + x3 * y1 - x1 * y3 - x2 * y1 - x3 * y2) 海伦公式:S=sqrt(p(p-a)(p-b)(p-c)),其中a,b,c为三角形边长,p=C/2是三角形的半周长 显然使用向量判断最简单便捷。

三、代码实现

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



四、总结

以上就是本道题的所有内容了,本系列会持续更,欢迎点赞、关注、收藏,另外如有其他的问题,欢迎下方留言给我,我会第一时间回复你,感谢~