LeetCode1037. 有效的回旋镖(python)

题目

给定一个数组 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

思路

首先想到直线任意两点直线的斜率相等,计算出相邻两点x和y坐标的差值

x1 = points[0][0] - points[1][0]
y1 = points[0][1] - points[1][1]
x2 = points[1][0] - points[2][0]
y2 = points[1][1] - points[2][1]

先排除存在相同点的情况,即两点间x和y坐标差值都为零

if x1 == y1 == 0 or x2 == y2 == 0:
    return False

y1和y2都不为零,都可以做分母的情况下计算斜率是否相同,来判断是否再一条直线上

if y1 != 0 and y2 != 0:
    return x1/y1 != x2/y2

x1和x2都不为零,都可以做分母的情况下计算斜率是否相同,来判断是否再一条直线上

if x1 != 0 and x2 != 0:
    return y1/x1 != y2/x2

最后还剩这两种种情况
当x1(x2)为0时,其余都不为零,即一条垂直于y轴的线和一条不垂直于y轴的线
当x1(x2)为0时,且y2(y1)为0,其余都不为零,即一条垂直于y轴的线和一条垂直于x轴的线
显然这两种情况,都是两条不同的直线

题解

class Solution:
    def isBoomerang(self, points: List[List[int]]) -> bool: 
    	# 先计算出相邻两点的差值(x1,y1)(x2,y2)
        x1 = points[0][0] - points[1][0]
        y1 = points[0][1] - points[1][1]
        x2 = points[1][0] - points[2][0]
        y2 = points[1][1] - points[2][1]
        # 如果存在两点之间x坐标和y坐标的差值都是零,证明这两点是相同的
        if x1 == y1 == 0 or x2 == y2 == 0:
            return False
        # 如果y1和y2都不是零,计算两点之间的直线的斜率,如果两条直线斜率不等,即为不在同一直线
        if y1 != 0 and y2 != 0:
            return x1/y1 != x2/y2
        # 如果x1和x2都不是零,计算两点之间的直线的1/斜率,如果两条直线斜率不等,即为不在同一直线
        elif x1 != 0 and x2 != 0:
            return y1/x1 != y2/x2
        # 最后剩下x1为0或y2为0,异或x2为0或y1为0
        else:
            return True

或者

class Solution:
    def isBoomerang(self, points: List[List[int]]) -> bool:
        if points[0] == points[1] or points[0] == points[2] or points[1] == points[2]:
            return False
        x1 = points[0][0] - points[1][0]
        y1 = points[0][1] - points[1][1]
        x2 = points[1][0] - points[2][0]
        y2 = points[1][1] - points[2][1]
        
        if y1 != 0 and y2 != 0:
            return x1/y1 != x2/y2
        elif x1 != 0 and x2 != 0:
            return y1/x1 != y2/x2
        else:
            return True

过啦~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值