✐拒绝平躺,每日一卷(第11天)
目录
⛅题目:
给定一个数组 points ,其中 points[i] = [x, y] 表示 X-Y 坐标平面上的一个点
如果这些点不共线 则返回 true ,共线则返回false。
🌠例1:
输入:points = [[1,1],[2,3],[3,2]]
输出:true
🌠例2:
输入:points = [[1,1],[2,2],[3,3]]
输出:false
题目分析:
运用中学的知识就可以由很多种解法
1.向量解法
假设有三点A(a,b),B(c,d),C(e,f)
向量AB = (c-a, d-b) 向量BC = (e-c, f-d)
1.若AB和BC不共线,则AB+BC不等于(C点和A点不重合时,重合时共线)
2.若AB和BC共线,则AB+BC=0向量(AB,BC反向),或AB-BC=0向量(AB,BC同向)2.
可以抛开特殊情况不谈,直接从共线入手就好
设A(x1,y1),B(x2,y2),C(x3,y3)
向量AB=(x2-x1,y2-y1),向量AC=(x3-x1,y3-y1)
A、B、C共线得:向量AB//向量AC
(x2-x1)(y3-y1)=(x3-x1)(y2-y1)
所以A、B、C共线:(x2-x1)(y3-y1)=(x3-x1)(y2-y1)
def isBoomerang(points):
"""AB = (points[1][0] - points[0][0], points[1][1] - points[0][1])
BC = (points[2][0] - points[1][0], points[2][1] - points[1][1])
AC = (points[2][0] - points[0][0], points[2][1] - points[0][1])
c = points[2][0] - points[1][0]
d = points[2][1] - points[1][1]
"""
a = points[1][0] - points[0][0]
b = points[1][1] - points[0][1]
e = points[2][0] - points[0][0]
f = points[2][1] - points[0][1]
return a*f != e*b
化为最简
def isBoomerang(points):
return (points[1][0] - points[0][0])*(points[2][1] - points[0][1]) != (points[2][0] - points[0][0])*(points[1][1] - points[0][1])
斜率解法
先判断有没有相同的点,再判断三点共不共线。
共线的判断方法是,计算点1和点0的斜率,再计算点2和点1的斜率,看两个斜率相不相同。
坑点有三个:
除法计算时除数不能为0;
斜率可能是浮点数所以要用1.0 *一下把计算结果转成浮点数;
两个浮点数比相同不能用等号,要用相减的差和0.0001的比大小来表示
3.面积解法
我们知道
1.当三点共线,三点构成三角形面积为0
2.当三点不共线,三点构成三角形面积不为0
知道三点计算三角形面积的公式有很多种,现在介绍下面这一种。
S=1/2[(x1y2-x2y1)+(x2y3-x3y2)+(x3y1-x1y3)
代码实现
def collinear(points):
return (points[0][0] * (points[1][1] - points[2][1]) + points[1][0] * (points[2][1] - points[0][1]) + points[2][0] * (points[0][1] - points[1][1])) != 0
很简短,所以解决问题不要复杂化,先用数学知识解决在用代码实现,效果有时会出乎意料
❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄end❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄