力扣每日一题0608-1037. 有效的回旋镖

126 阅读2分钟

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

给定一个数组 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[0]\textit{points}[0] 开始,分别指向 points[1]\textit{points}[1]points[2]\textit{points}[2] 的向量 v1\vec{v}_1v2\vec{v}_2。「三点各不相同且不在一条直线上」等价于「这两个向量的叉乘结果不为零」:

v1×v20\vec{v}_1 \times \vec{v}_2 ​\not= \vec{0}

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

复杂度分析

  • 时间复杂度:O(1)。
  • 空间复杂度:O(1)。

image.png

三点共线问题,若三点共线,则任意组成的两个向量叉乘为0;

向量叉乘公式:A×B=x1y1x2y2A \times B = {x}_1{y}_1 - {x}_2{y}_2

我们设这三个点为A(x1y1)A({x}_1{y}_1)B(x2y2)B({x}_2{y}_2)C(x3y3)C({x}_3{y}_3),设有向量AB和向量BC

若ABC三点共线,则 向量AB X 向量BC = 0

向量AB=x2x1,y2y1AB = ({x}_2-{x}_1,{y}_2-{y}_1),向量BC=x3x2,y3y2BC = ({x}_3-{x}_2,{y}_3-{y}_2)

AB×BC=(x2x1)(y3y2)(y2y1)(x3x2)AB \times BC = ({x}_2-{x}_1) *({y}_3-{y}_2)-({y}_2-{y}_1)* ({x}_3-{x}_2)

var isBoomerang = function(points) {
	return (points[0][0] - points[1][0]) * (points[1][1] - points[2][1]) - (points[0][1] - points[1][1]) * (points[1][0] - points[2][0]) != 0;
	}

image.png

斜率比较

设三点分别为 (x1,y1),(x2,y2),(x3,y3)(x_1,y_1), (x_2,y_2), (x_3,y_3)。两点之间斜率计算公式为 y2y1x2x1\frac{y_2-y_1}{x_2-x_1}

要使得三点不共线,需要满足 y2y1x2x1y3y2x3x2\frac{y_2-y_1}{x_2-x_1}\neq\frac{y_3-y_2}{x_3-x_2},我们将式子变形得到 (y2y1)(x3x2)(y3y2)(x2x1)(y_2-y_1)(x_3-x_2) \neq (y_3-y_2)(x_2-x_1)

注意:

  1. 当两点之间斜率不存在,即 x1=x2x_1=x_2,上述变式仍然成立;
  2. 若斜率除法运算比较存在精度问题,同样可以变换为乘法。
var isBoomerang = function(points) {
        let x1 = points[0][0], y1 = points[0][1];
        let x2 = points[1][0], y2 = points[1][1];
        let x3 = points[2][0], y3 = points[2][1];
        return (y2 - y1) * (x3 - x2) != (y3 - y2) * (x2 - x1);
    }

image.png