【算法】Max Points On A Line 坐标系中一条直线上的最多点数

该博客探讨了如何在一组坐标点中找出能构成一条直线的最大点数。通过计算不同点对之间的斜率,判断它们是否位于同一直线上。特殊情况包括水平线和相同坐标点的处理。博主分享了算法思路及Swift代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Max Points On A Line 坐标系中一条直线上的最多点数

题目

给出一组坐标系的点,求出能连成一条直线的最多点数

解题思路

  1. 将坐标点 p1 的 x1 与 y1 的值,依次与后面的坐标点 pn的 xn 与 yn 做差值并相除((x1 - xn) / (y1 - yn))得出两点之间的斜率
  2. 若有其他坐标点 pm 与坐标点 p1 的斜率相同,则 p1 、 pn 、 pm 在一条直线上
  3. 有两个特殊情况
    • 由于 y 的差值为除数,所以若差为 0 即为不合理数,且此时的两点是处于同一水平线上的,将此情况单独摘出,独立计算点数
    • 当有相同坐标点存在时,即所有与此坐标点相关的连线点数都适用,亦可独立记重复点数,在比较最大点数时再加上去
  4. 记录并更新当前最大点数
  5. 从 p2 开始依次向后重复操作,

代码实现

class func MaxPointOnLineSolution(points:[[Int]]) -> Int{
        let count = points.count
//        当坐标点数量小于3时,最多点数即为坐标点数量
        if(count<3){
            return count;
        }
//        声明最多点数
        var maxPoint = 0
//        外层循环,用以拿到比较的坐标点
        for pointFK in 0 ..< count-1 {
//            获取比较的坐标点
            let pf = points[pointFK]
//            以斜率为key,被比较的坐标点数为value,声明一个dictionary
            var map = [Double:Int]()
//            声明变量用以记录相同的被比较坐标点数
            var samePointNum = 0
//            声明变量用以记录y差值为0,即在同一水平线的d被比较坐标点数
            var line = 0
//            声明变量记录此次外层循环中,除两种特殊情况的最多的被比较坐标点数
            var currentMaxPoint = 0
//            内层循环,用以拿到被比较的坐标点
            for pointTK in pointFK+1 ..< count {
//                获取被比较的坐标点
                let pt = points[pointTK]
//                计算两点的x、y的差值
                let vx = Double(pt[0]-pf[0])
                let vy = Double(pt[1]-pf[1])
                var key = Double(0)
                if(vx != 0 && vy == 0){ //当y的差值为0时,水平点数+1,并跳过此次循环
                    line += 1
                    continue
                }else if(vx == 0 && vy == 0){   //当两点重复时,记录相同点数,并跳过此次循环
                    samePointNum += 1
                    continue
                }else{  //计算斜率
                    key = vx/vy
                }
                if(map.keys.contains(key)){ //若斜率的key已存在,将value 点数 +1
                    map[key]! += 1;
                }else{  //若斜率的key不存在,则创建key
                    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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值