leetcode刷题记录-1037. 有效的回旋镖

133 阅读2分钟

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

前言

今天的题目为简单,题目为简单的数学题,如果比较了解数学一些向量的机制的话,那么这道题应该会变得非常简单。

每日一题

今天的题目是 1037. 有效的回旋镖,难度为简单

  • 给定一个数组 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,b),(c,d),(e,f) 三个点,那么就可以求出三个斜率,并且对斜率还要做出绝对值处理。

const k1 = Math.abs(c - a) / (d - b);
const k2 = Math.abs((e - a) / (f - b);
const k3 = Math.abs((e - c) / (f - d);

判断三个斜率是否相等就能够知道三个点是否在一条直线上。

function isBoomerang(points: number[][]): boolean {
    if(isTheSame(points[1],points[0]) || isTheSame(points[2],points[0]) || isTheSame(points[1],points[2])){
        return false
    }
    const k1 = Math.abs((points[1][0] - points[0][0]) / (points[1][1] - points[0][1]));
    const k2 = Math.abs((points[2][0] - points[0][0]) / (points[2][1] - points[0][1]));
    const k3 = Math.abs((points[2][0] - points[1][0]) / (points[2][1] - points[1][1]));
    console.log(k1,k2,k3)
    if(k1 == k2 && k2 == k3){
        return false
    }
    return true
};

function isTheSame(coordinate1:number[],coordinate2:number[]):boolean{
    if(coordinate1[0]==coordinate2[0] && coordinate1[1]==coordinate2[1]){
        return true
    }
    return false
}

image.png

数学解法

有接触过数学的向量可能就会清楚,对于一个平面上的两条线,只要他们的向量叉乘为0,那么就说明这两条线平行,并且因为题目中是三个点,组成两条线的话一定会有一个公用的点,所有一旦平行,那么就说明三个点再一条直线上面,我们就能够以此来判断,三个点的位置。

var isBoomerang = function(points: number[]):boolean {
    const coordinate1 = [points[1][0] - points[0][0], points[1][1] - points[0][1]];
    const coordinate2 = [points[2][0] - points[0][0], points[2][1] - points[0][1]];
    return coordinate1[0] * coordinate2[1] - coordinate1[1] * coordinate2[0] != 0;
};

image.png