【Leetcode刷題筆記 持續更新】Day05
阿新 • • 發佈:2021-01-19
技術標籤:刷題筆記
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;
}
};