持续创作,加速成长!这是我参与「掘金日新计划 · 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;
};
四、总结
以上就是本道题的所有内容了,本系列会持续更,欢迎点赞、关注、收藏,另外如有其他的问题,欢迎下方留言给我,我会第一时间回复你,感谢~