持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第18天,点击查看活动详情
一、题目描述:
给定一个数组 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
提示:
- points.length == 3
- points[i].length == 2
- 0 <= xi, yi <= 100
二、思路分析:
注意是:不在一条直线上 才返回true; //其实可以不用 判断是否有重复的点,因为只要 有重复的点,那么这三个点必定在同一条直线上。 题中先判断是否有重复的点,经过筛选后,就没有重复的点了。 如果0,1两点x不等,那么就直接计算k0,如果1,2x相等,那么必定不在一条直线上(因为1,2的y必定不等) 如果0,1两点x相等,那么直接看0,2两点x是否相等,如果不等 ,那么必定 不在一条直线上。return true;反之相等 return false;
三、AC 代码:
class Solution {
public:
bool isBoomerang(vector<vector<int>>& point) {
/*
直接判断是否都在一条直线上就行。
两点构成一条直线,所以计算任意两条直线的斜率K即可.
为了避免有重复的点,可以选择计算所有任意两个点的斜率。
*/
if(point[0][0] == point[1][0]&&point[0][1] == point[1][1]){
return false;
}else if(point[0][0] == point[2][0]&&point[0][1] == point[2][1]){
return false;
}else if(point[1][0] == point[2][0]&&point[1][1] == point[2][1]){
return false;
}
double k1 = 0;
double k2 = 0;
if(point[0][0]-point[1][0]!=0){
k1 = (point[0][1] - point[1][1])* 1.0/(point[0][0]-point[1][0]);
if(point[0][0]-point[2][0]!=0){
k2 = (point[0][1] - point[2][1]) * 1.0/(point[0][0]-point[2][0]);
if(k1 == k2)return false;
else return true;
}else{
return true;
}
}
else{
k1 = point[0][0];
if(point[1][0]-point[2][0]!=0){
return true;
}else{
return false;
}
}
}
};