1. 程式人生 > 其它 >【LeetCode】1232. 綴點成線

【LeetCode】1232. 綴點成線

技術標籤:LeetCode

題目連結:https://leetcode-cn.com/problems/check-if-it-is-a-straight-line/

難度:簡單

題目描述

在一個XY 座標系中有一些點,我們用陣列coordinates來分別記錄它們的座標,其中coordinates[i] = [x, y]表示橫座標為 x、縱座標為 y的點。

請你來判斷,這些點是否在該座標系中屬於同一條直線上,是則返回 true,否則請返回 false。

測試用例

示例 1:

輸入:coordinates = [[1,2],[2,3],[3,4],[4,5],[5,6],[6,7]]
輸出:true

示例 2:

輸入:coordinates = [[1,1],[2,2],[3,4],[4,5],[5,6],[7,7]]
輸出:false

提示:

2 <=coordinates.length <= 1000
coordinates[i].length == 2
-10^4 <=coordinates[i][0],coordinates[i][1] <= 10^4
coordinates中不含重複的點

題解

常規求法是找三個點A、B、C,判斷AB的斜率和AC的斜率是否一致,但求斜率時用到除法,會出現分母為零的情況,並且除法的結果double型別比較時會由於精度問題出現錯誤。

\frac{y_{B}-y_{A}}{x_{B}-x_{A}} = \frac{y_{C}-y_{A}}{x_{C}-x_{A}}

因此將其改為乘法比較,把第0個元素作為點A,第1個元素作為點B:

\frac{y_{1}-y_{0}}{x_{1}-x_{0}} = \frac{y_{i}-y_{0}}{x_{i}-x_{0}}

化為乘法:

(y_{1}-y_{0})* (x_{i}-x_{0}) = (y_{i}-y_{0})* (x_{1}-x_{0})

判斷上述條件是否成立即可。

程式碼如下

// java 

class Solution {
    public boolean checkStraightLine(int[][] coordinates) {
        int x1_x0 = coordinates[1][0] - coordinates[0][0];
        int y1_y0 = coordinates[1][1] - coordinates[0][1];
        int len = coordinates.length;
        for (int i = 2; i < len; i++){
            int xi_x0 = coordinates[i][0] - coordinates[0][0];
            int yi_y0 = coordinates[i][1] - coordinates[0][1];
            if (x1_x0 * yi_y0 != xi_x0 * y1_y0)
                return false;
        }
        return true;
    }
}