Day05
今天坚持住了,因为每日一题很简单,没用到什么复杂算法,要不我这小脑袋瓜是绝对不行的。自己写出来的,但是提交结果就很…来张截图,这就是赢了空间败给时间么…
结果看了一些别人的,才发现上头了。。在思路里说
缀点成线
在一个 XY 坐标系中有一些点,我们用数组 coordinates 来分别记录它们的坐标,其中 coordinates[i] = [x, y] 表示横坐标为 x、纵坐标为 y 的点。
请你来判断,这些点是否在该坐标系中属于同一条直线上,是则返回 true,否则请返回 false。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/check-if-it-is-a-straight-line
思路:
因为是判断点是否在一条直线上,所以里边只要有一个点不符合就可以了,我最开始想到的是两点法,即斜率为定值,但是我用的是除法,在这里就产生了问题,如果他与x轴或y轴平行或重合就会很麻烦,我也没有察觉有什么不妥,就直接傻乎乎的分情况讨论加判断。。。
其实应该转换一下思路,用乘法,这样就不会出现除数为0的情况,又简单又省事…这就是我知识浅薄,不找借口了,就是菜…
这也告诉我,以后若碰见除法运算时,尽可能转换为乘法。
我最开始的
class Solution {
public:
bool isparallel(vector<vector<int>>& coordinates,int m)
{
int length=coordinates.size();
for(int i=0;i<length;i++)
{
for(int j=i+1;j<length;j++)
{
if((coordinates[i][m]-coordinates[j][m])==0)
{
return true;
}
}
}
return false;
}
bool checkStraightLine(vector<vector<int>>& coordinates) {
int length=coordinates.size();
if(isparallel(coordinates,0)==true)
{
for(int i=0;i<length;i++)
{
for(int j=i+1;j<length;j++)
{
if((coordinates[i][0]-coordinates[j][0])!=0)
{
return false;
}
}
}
return true;
}
else if(isparallel(coordinates,1)==true)
{
for(int i=0;i<length;i++)
{
for(int j=i+1;j<length;j++)
{
if((coordinates[i][1]-coordinates[j][1])!=0)
{
return false;
}
}
}
return true;
}
else
{
float k=(coordinates[0][1]-coordinates[1][1])/(coordinates[0][0]-coordinates[1][0]);
for(int i=0;i<length;i++)
{
for(int j=i+1;j<length;j++)
{
if(k!=(coordinates[i][1]-coordinates[j][1])/(coordinates[i][0]-coordinates[j][0]))
{
return false;
}
}
}
return true;
}
}
};
别人家的
class Solution {
public:
bool checkStraightLine(vector<vector<int>>& coor) {
int n = coor.size();
for (int i = 1; i + 1 < n; i++) {
if((long long)(coor[i][0] - coor[i - 1][0]) * (coor[i + 1][1] - coor[i][1]) !=
(long long)(coor[i][1] - coor[i - 1][1]) * (coor[i + 1][0] - coor[i][0])){
return false;
}
}
return true;
}
};