美文网首页
LeetCode 1232. Check If It Is a

LeetCode 1232. Check If It Is a

作者: 微微笑的蜗牛 | 来源:发表于2020-05-10 08:35 被阅读0次

@(LeetCode)

问题描述

给定一个坐标点数组,每个坐标点表示为:coordinates[i] = [x, y],其中 [x, y] 代表点的坐标。检查这些点是否在一条直线上。

栗 1:

image.png
输入:coordinates = [[1,2],[2,3],[3,4],[4,5],[5,6],[6,7]]
返回:true

栗 2:

image.png
输入:coordinates = [[1,1],[2,2],[3,4],[4,5],[5,6],[7,7]]
返回:true

注意:

  • 2 <= coordinates.length <= 1000
  • coordinates[i].length == 2
  • -10^4 <= coordinates[i][0], coordinates[i][1] <= 10^4
  • coordinates 中没有重复的点。

想看英文原文的戳这里

解题思路

这是一道灰常简单的题目,有相关数学知识即可。

如果一些点在一条直线上,那么任意两点组成线段的斜率相同。

因此,可将题目转换为:计算两点之间的斜率,与初始斜率做比较,判定条件如下。

  • 若不等,则不在一条直线;
  • 若所有的点都相等,则在一条直线上。

而两个点的选择,只需从头遍历点即可。

比如 [x0, y0], [x1, y1], [x2, y2] 三点之间的比较如下:

// 除法比较
(y1 - y0) / (x1 - x0) = (y2 - y1) / (x2 - x1)

若采用上面除法的方式比较斜率,则需要注意浮点数相等的比较。不过也可换一种方式,采用乘法来比较,如下所示。

// 转换为乘法
(y1 - y0) * (x2 - x1) = (y2 - y1) * (x1 - x0)

js 代码:

var checkStraightLine = function (coordinates) {
  if (coordinates && coordinates.length > 0) {
    let i = 0
    
    // 记录初始斜率
    let ratio = -1

    while (i < coordinates.length - 1) {
      const point1 = coordinates[i]
      const point2 = coordinates[i + 1]

      const xDistance = point2[0] - point1[0]
      const yDistance = (point2[1] - point1[1])
      
      if (xDistance === 0) {
          return false
      }

      // 计算当前斜率
      const curRatio = yDistance / xDistance

      // 更新初始斜率
      if (ratio === -1) {
        ratio = curRatio
      }

      // 比较斜率,注意小数的比较
      if (Math.abs(curRatio - ratio) >= 1e-6) {
        return false
      }

      i += 1
    }

    return true
  }

  return false
};

完整代码可点此查看

相关文章

网友评论

      本文标题:LeetCode 1232. Check If It Is a

      本文链接:https://www.haomeiwen.com/subject/ufydnhtx.html