题目描述
-
缀点成线
给定一个数组 coordinates ,其中 coordinates[i] = [x, y] , [x, y] 表示横坐标为 x、纵坐标为 y 的点。请你来判断,这些点是否在该坐标系中属于同一条直线上。
示例 1:
输入:coordinates = [[1,2],[2,3],[3,4],[4,5],[5,6],[6,7]] 输出:true 示例 2:
输入:coordinates = [[1,1],[2,2],[3,4],[4,5],[5,6],[7,7]] 输出:false
提示:
2 <= coordinates.length <= 1000 coordinates[i].length == 2 -10^4 <= coordinates[i][0], coordinates[i][1] <= 10^4 coordinates 中不含重复的点
解题思路
法1
方法1:斜率计算
计算与固定点(这里我们选择第一个点)的斜率相同则在同一条直线上
-
维护一个斜率的变量,
-
查看第一个点与第二个点x值是否相同,如果相同则只需要判断后面的值x值相同即可
-
如果不同,则计算第一个与第二个值的斜率,储存在k中
-
循环遍历其他点与第一个点求斜率,如果发现斜率不同的就返回false,
结束返回true
-
时间复杂度(O(n)) -
空间复杂度(O(1))
执行结果
法1
func checkStraightLine(coordinates [][]int) bool {
//斜率
var k float32
//与x平行
if coordinates[0][0]==coordinates[1][0]{
for i:=2;i<len(coordinates);i++{//x坐标是否相同
if coordinates[i][0]!=coordinates[0][0]{
return false
}
}
return true
}else{//斜率存在
计算斜率
k=(float32(coordinates[0][1])-float32(coordinates[1][1]))/(float32(coordinates[0][0])-float32(coordinates[1][0]))
//遍历计算其他斜率,看斜率是否相同
for i:=2;i<len(coordinates);i++{
if k!=(float32(coordinates[0][1])-float32(coordinates[i][1]))/(float32(coordinates[0][0])-float32(coordinates[i][0])){
return false
}
}
}
return true
}
执行结果: 通过 显示详情 查看示例代码 添加备注
执行用时: 4 ms , 在所有 Go 提交中击败了 100.00% 的用户 内存消耗: 3.5 MB , 在所有 Go 提交中击败了 0.00% 的用户 通过测试用例: 80 / 80
本文由 mdnice 多平台发布