一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第20天,点击查看活动详情。
题目描述
给定一个数组 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 == 3points[i].length == 20 <= xi, yi <= 100
思路分析
根据题意可知,一个数组里面包含三个点,若这三个点在一个平面上且不在同一条线上,那么这三个点就满足成为回旋镖的条件。那么现在我们就需要让这三个点满足不在同一条线上。
根据以前所学的数学知识,当同一个平面中的三个点,两个点两两组成的两条线的斜率相等,那么这两条线就会重合,也就说明这三个点在同一条线上。
假设points的三个点是a,b,c三个点,坐标分别是(x1,y1),(x2,y2),(x3,y3),a点和b点的斜率就是(y1 - y2) / (x1 - x2),a点和c点的斜率a点和c点的斜率(y1 - y3) / (x1 - x3),若两个斜率相等,那么a点和b点组成的线条和a点和c点组成的线条就是重合状态,说明a,b,c三点在同一条线上,points数组里面的三个点则不可以组成回旋镖,可以return false,否则直接 return true。
AC代码
let points = [[1,1],[2,3],[3,2]]
function isBoomerang(arr) {
let x1 = arr[0][0]
let y1 = arr[0][1]
let x2 = arr[1][0]
let y2 = arr[1][1]
let x3 = arr[2][0]
let y3 = arr[2][1]
// a点和b点的斜率是(y1 - y2) / (x1 - x2);a点和c点的斜率(y1 - y3) / (x1 - x3),为方便计算,将斜率交叉相乘,两边相等即是斜率相等
let k1 = (y1 - y2) * (x1 - x2)
let k2 = (y1 - y3) * (x1 - x2)
console.log(k1 != k2)
}
isBoomerang(points)