一、题目解析
题目描述
小M正在玩一个几何游戏,给定一个二维平面上的三个点 points,其中每个点用坐标 points[i] = [xi, yi] 表示。如果三点构成一个回旋镖,则返回 true。回旋镖的定义是三点不在一条直线上,并且这三个点互不相同。
请你帮助小M判断这些点是否构成一个回旋镖。
1、题目分析
这道题考的是用代码来判断三个点是否在一条线上,即两条线段的斜率是否相同。以及对于vector的熟练程度,能否理解vector<vector>的含义。
2、算法分析
vector<vector>v1表示一个vector类型里面的变量类型是一个vector,我们可以理解为是一个二维数组。 vector类型可以使用[]运算符来返回相应元素的引用。我们可以用v1[i][j]来表示不同的点的坐标位置。 斜率的计算:设两个点为(x1,y1),(x2,y2),斜率为(y1-y2)/(x1-x2)。
代码实现
bool solution(vector<vector<int>>& points)
{
if (points[0] == points[1] || points[1] == points[2] || points[0] == points[2])
{
return false;
}
int x1 = points[0][0], y1 = points[0][1];
int x2 = points[1][0], y2 = points[1][1];
int x3 = points[2][0], y3 = points[2][1];
if ((y2 - y1) * (x3 - x1) != (y3 - y1) * (x2 - x1))
{
return true;
}
return false;
}
代码详解
首先判断特殊情况,当三个点的坐标有两个相同时不满足要求,返回false。 利用x1,x2,x3分别表示三个点的横坐标,用y1,y2,y3来表示三个点的纵坐标。 斜率k1=(y2-y1)/(x2-x1),k2=(y3-y1)/(x3-x1) 由于横纵坐标都是int型,则求出的k为int类型,误差会很大,所以假设两个斜率相同,即k1=k2,经过变换可以得到(y2-y1)(x3-x1)=(y3-y1)(x2-x1) 所以我们可以通过判断(y2-y1)(x3-x1)是否等于(y3-y1)(x2-x1)来判断两条线斜率是否相同。 如果两条线的斜率不相同则代表三个点能够构成一个回旋镖,返回true 否则三个点不能构成一个回旋镖,返回false。
二、知识总结
vector类型可以使用[]来返回对应元素的引用。 vector<vector>表示这个vector类型里面的变量类型为vector类型。我们可以使用二维数组的使用方式,用[][]来使用里面的数据。