5051. 有效的回旋镖
题目难度 Easy
题目描述
回旋镖定义为一组三个点,这些点各不相同且不在一条直线上。
给出平面上三个点组成的列表,判断这些点是否可以构成回旋镖。
示例 1:
输入:[[1,1],[2,3],[3,2]]
输出:true
示例 2:
输入:[[1,1],[2,2],[3,3]]
输出:false
提示:
points.length == 3
points[i].length == 2
0 <= points[i][j] <= 10
解法
这道题做完深刻的后悔线性代数没好好学…
我的做法很菜,就是先判断三点是否有重合,如果没有的话就判断是否有平行x轴的情况出现,因为后面的斜率计算中不能有除0。最后计算斜率和b,计算出直线的方程后进行判断。
class Solution {
public:
bool isBoomerang(vector<vector<int>>& points) {
if(points[0][0]==points[1][0]&&points[0][1]==points[1][1])
return false;
if(points[0][0]==points[2][0]&&points[0][1]==points[2][1])
return false;
if(points[2][0]==points[1][0]&&points[2][1]==points[1][1])
return false;
if(points[1][0]-points[0][0]==0)
if(points[2][0]-points[0][0]==0)
return false;
else
return true;
double k = double((points[1][1] - points[0][1])) / (points[1][0] - points[0][0]);
double b=points[0][1]-k*points[0][0];
if(fabs(points[2][1]-points[2][0]*k-b)<1e-6)
return false;
return true;
}
};
直到发现可以直接用矩阵计算,计算三点围成的三角形是否面积为0。
class Solution {
public:
int det(int x1, int y1, int x2, int y2, int x3, int y3){
return x1*y2-x2*y1+x2*y3-x3*y2+x3*y1-x1*y3;
}
bool isBoomerang(vector<vector<int>>& p) {
return det(p[0][0], p[0][1], p[1][0], p[1][1], p[2][0], p[2][1]) != 0;
}
};