持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第15天,点击查看活动详情
题目
给定一个数组 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 == 3points[i].length == 20 <= xi, yi <= 100
思考
这是今天的每日一题,本题难度简单。
首先是读懂题意。题目中给定一个数组 points ,数组的每一项都表示 X-Y 平面上的一个点,如果这些点构成一个 回旋镖 则返回 true 。我们从题目中可以知道,回旋镖的定义是一组三个点,这些点 各不相同 且 不在一条直线上 。
我们可以假设三个点分别为p1, p2, p3,我们可以两次分别取出其中两个点,比如p1p2、p2p3,计算组成的直线的斜率。接着,如果如果这些点 各不相同 且 不在一条直线上,则我们计算得到的两条直线的斜率不同,即 (y3-y1)/(x3-x1) !== (y2-y1)/(x2-x1)。为了避免x坐标相等导致除数为 0 的情况,可以将斜率改为乘法,即 (y3-y1)*(x2-x1) !== (y2-y1)*(x3-x1)。
我们只需要根据题目给出的数组 points 进行计算即可,因此,时间复杂度和空间复杂度均为O(1)。可见,本题难度简单,只要找到方法就可解决该问题。
解答
方法一:计算斜率
/**
* @param {number[][]} points
* @return {boolean}
*/
var isBoomerang = function(points) {
let k1 = (points[2][1] - points[0][1]) * (points[1][0]- points[0][0])
let k2 = (points[1][1] - points[0][1]) * (points[2][0]- points[0][0])
return k1 !== k2
}
复杂度分析:
- 时间复杂度:O(1)。
- 空间复杂度:O(1)。