跳至主要內容

1037. 有效的回旋镖


1037. 有效的回旋镖

🟢   🔖  几何 数组 数学  🔗 力扣open in new window LeetCodeopen in new window

题目

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),可以用以下公式判断 ABAC 的向量是否共线: (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);
};