LeetCode探索(87):1037-有效的回旋镖

131 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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 == 3
  • points[i].length == 2
  • 0 <= 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)。

参考