题目
给定一个数组 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
过啦~