力扣 leetcode 1232. 缀点成线 (python)

Topic:

在一个 XY 坐标系中有一些点,我们用数组 coordinates 来分别记录它们的坐标,其中 coordinates[i] = [x, y] 表示横坐标为 x、纵坐标为 y 的点。
请你来判断,这些点是否在该坐标系中属于同一条直线上,是则返回 true,否则请返回 false。

Example_1:
力扣 leetcode 1232. 缀点成线 (python)_第1张图片

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

Example_2:
力扣 leetcode 1232. 缀点成线 (python)_第2张图片

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

Solution:

分为两种情况判断:
1.当斜率为0时仅需保证横坐标相同
2.当斜率不为0时需确保斜率相等

Code_1:

class Solution:
    def checkStraightLine(self, coordinates: List[List[int]]) -> bool:
        if coordinates[1][0] - coordinates[0][0] == 0:  # 斜率不存在时判断横坐标是否均相同
            j = coordinates[0][0]
            for i in range(1, len(coordinates)):
                if coordinates[i][0] == j:
                    pass
                else:
                    return False

        else:
            a = (coordinates[1][1] - coordinates[0][1]) / (coordinates[1][0] - coordinates[0][0])
            for i in range(2, len(coordinates)):
                if coordinates[i][0] - coordinates[i - 1][0] == 0:  # 只要横坐标之差出现0就错误,避免除以0的情况
                    return False
                elif (coordinates[i][1] - coordinates[i - 1][1]) / (coordinates[i][0] - coordinates[i - 1][0]) == a:
                    pass
                else:
                    return False
        
        return True

Code_2:
同样还可以转换为乘法进行运算

class Solution:
    def checkStraightLine(self, coordinates: List[List[int]]) -> bool:
        if coordinates is None or len(coordinates) <= 2:
            return True

        y = coordinates[1][1] - coordinates[0][1]
        x = coordinates[1][0] - coordinates[0][0]

        for i in range(2, len(coordinates)):
            y1 = coordinates[i][1] - coordinates[0][1]
            x1 = coordinates[i][0] - coordinates[0][0]
            if y * x1 != y1 * x:
                return False
        
        return True

Result:
力扣 leetcode 1232. 缀点成线 (python)_第3张图片

你可能感兴趣的:(python,leetcode,算法,leetcode,python,数据结构)