刷题日记 1037. 有效的回旋镖

47 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第23天,点击查看活动详情

一、题目描述:

1037. 有效的回旋镖 - 力扣(LeetCode) (leetcode-cn.com)

给定一个数组 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:(xa,ya),B:(xb,yb),C:(xc,yc),分别按顺序对应数组中的三个点。 要求A、B、C三点不在同一条直线上,需要 向量AB与向量AC不共线。 向量AB = (x1,y1),其中 x1 = xb - xa,y1 = yb - ya 向量BC = (x2,y2),其中 x2 = xc - xb, y2 = yc - yb

若AB、BC共线,则:y1/x1 = y2/x2。为了防止出现 x1 或者 x2 等于 0 的情况,将等式进行处理, 变为乘法的形式,即:y1x2 = y2x1。 满足该等式即返回“false”,不满足则返回“true”。

三、AC 代码:

class Solution {
    public boolean isBoomerang(int[][] points) {
        int x1 = points[1][0] - points[0][0],x2 = points[2][0] - points[0][0];
		int y1 = points[1][1] - points[0][1],y2 = points[2][1] - points[0][1];
		if(y1 * x2 == y2 * x1)
			return false;
	    return true;
    }
}

四、总结:

数学小知识 计算几何学中利用叉积判断两条线的相对位置,当且仅当叉积为0时,向量共线。

范文参考

利用两点间的斜率进行计算,如果存在两个点相同,则返回false,如果存在三个点连接之间的斜率相同也返回false,否则为true - 有效的回旋镖 - 力扣(LeetCode)

【LetMeFly】1037.有效的回旋镖:斜率 - 一行解决 - 有效的回旋镖 - 力扣(LeetCode)

【Python3】尽量不要用除法,会因为float类型计算时产生误差 - 有效的回旋镖 - 力扣(LeetCode)