文章目录
Max Points On A Line 坐标系中一条直线上的最多点数题目解题思路代码实现
Max Points On A Line 坐标系中一条直线上的最多点数
题目
给出一组坐标系的点,求出能连成一条直线的最多点数
解题思路
将坐标点 p
1 的 x
1 与 y
1 的值,依次与后面的坐标点 p
n的 x
n 与 y
n 做差值并相除((x
1 - x
n) / (y
1 - y
n))得出两点之间的斜率若有其他坐标点 p
m 与坐标点 p
1 的斜率相同,则 p
1 、 p
n 、 p
m 在一条直线上有两个特殊情况
由于 y 的差值为除数,所以若差为 0 即为不合理数,且此时的两点是处于同一水平线上的,将此情况单独摘出,独立计算点数当有相同坐标点存在时,即所有与此坐标点相关的连线点数都适用,亦可独立记重复点数,在比较最大点数时再加上去 记录并更新当前最大点数从 p
2 开始依次向后重复操作,
代码实现
class func MaxPointOnLineSolution(points
:[[Int]]) -> Int{
let count = points
.count
if(count<3){
return count;
}
var maxPoint
= 0
for pointFK
in 0 ..< count-1 {
let pf
= points
[pointFK
]
var map = [Double:Int]()
var samePointNum
= 0
var line
= 0
var currentMaxPoint
= 0
for pointTK
in pointFK
+1 ..< count {
let pt
= points
[pointTK
]
let vx
= Double(pt
[0]-pf
[0])
let vy
= Double(pt
[1]-pf
[1])
var key
= Double(0)
if(vx
!= 0 && vy
== 0){
line
+= 1
continue
}else if(vx
== 0 && vy
== 0){
samePointNum
+= 1
continue
}else{
key
= vx
/vy
}
if(map.keys
.contains(key
)){
map[key
]! += 1;
}else{
map[key
] = 1;
}
if(map[key
]! > currentMaxPoint
){
currentMaxPoint
= map[key
]!
}
}
currentMaxPoint
= currentMaxPoint
> line
? currentMaxPoint
: line
currentMaxPoint
+= samePointNum
+ 1
maxPoint
= currentMaxPoint
> maxPoint
? currentMaxPoint
: maxPoint
}
return maxPoint
}
代码地址:https://github.com/sinianshou/EGSwiftLearning