1037. 有效的回旋镖
1037. 有效的回旋镖
题目
Given an array points
where points[i] = [xi, yi]
represents a point on the X-Y plane, return true
if these points are aboomerang.
A boomerang is a set of three points that are all distinct and not in a straight line.
Example 1:
Input: points = [[1,1],[2,3],[3,2]]
Output: true
Example 2:
Input: points = [[1,1],[2,2],[3,3]]
Output: false
Constraints:
points.length == 3
points[i].length == 2
0 <= xi, yi <= 100
题目大意
给定一个数组 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
解题思路
题目要求判断由三个点组成的三角形是否为回旋镖,即这三个点不能共线。
- 三个点共线的充要条件是三点构成的向量间的斜率相同。
- 对于点
A(x1, y1)
,B(x2, y2)
,C(x3, y3)
,可以用以下公式判断AB
和AC
的向量是否共线:(x1 - x2) * (y1 - y3) == (x1 - x3) * (y1 - y2)
- 如果等式成立,则点共线;否则点不共线。
- 另外,如果三个点中有两个点重复,则等式也成立。
复杂度分析
- 时间复杂度:
O(1)
,仅涉及常量次的数值运算。 - 空间复杂度:
O(1)
,仅使用了少量变量存储坐标值和中间计算结果。
代码
/**
* @param {number[][]} points
* @return {boolean}
*/
var isBoomerang = function (points) {
// 解构三点的坐标
const x1 = points[0][0];
const x2 = points[1][0];
const x3 = points[2][0];
const y1 = points[0][1];
const y2 = points[1][1];
const y3 = points[2][1];
// 检查是否共线
return (x1 - x2) * (y1 - y3) !== (x1 - x3) * (y1 - y2);
};