Swift解题 | 求平面上同一条直线的最多点数

在这里插入图片描述
在这里插入图片描述

文章目录

    • 前言
    • 摘要
    • 问题描述
    • 解题思路
    • Swift 实现代码
    • 代码分析
    • 示例测试与结果
    • 时间复杂度
    • 空间复杂度
    • 总结
    • 关于我们

前言

本题由于没有合适答案为以往遗留问题,最近有时间将以往遗留问题一一完善。

149. 直线上最多的点数

不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。

难度水平:中等

摘要

在平面几何中,找出最多的点共线是一个经典问题。本文详细解析如何使用Swift解决该问题,并基于斜率计算,逐步实现高效的算法解决方案。同时,提供可运行的代码模块及复杂度分析,帮助读者掌握这一算法的核心思想。

问题描述

给你一个数组 points ,其中 points[i] = [xi, yi] 表示 X-Y 平面上的一个点。求最多有多少个点在同一条直线上。

示例 1:

在这里插入图片描述

输入: points = [[1,1],[2,2],[3,3]]
输出: 3

示例 2:

在这里插入图片描述

输入: points = [[1,1],[3,2],[5,3],[4,1],[2,3],[1,4]]
输出: 4

提示:

  • 1 <= points.length <= 300
  • points[i].length == 2
  • -104 <= xi, yi <= 104
  • points 中的所有点 互不相同

解题思路

  1. 斜率定义
    两点共线可以通过斜率判断。如果两点的斜率相等,则它们位于同一条直线上。斜率公式为:
    [
    slope = \frac{\Delta y}{\Delta x}
    ]
    使用最大公约数(GCD)将分子和分母化简,以避免浮点误差。

  2. 双重循环
    对于每个点,计算其与其他所有点的斜率,将斜率存入哈希表,并统计每种斜率的出现次数。

  3. 处理重复点和垂直线

    • 如果点重合,直接计入重复点数。
    • 如果两点垂直,则斜率无穷大,可单独处理。

Swift 实现代码

import Foundation

func maxPoints(_ points: [[Int]]) -> Int {
    guard points.count > 1 else { return points.count }

    var maxPointsOnLine = 1

    for i in 0..<points.count {
        var slopeCount = [String: Int]()
        var duplicates = 1
        var currentMax = 0

        for j in i+1..<points.count {
            let dx = points[j][0] - points[i][0]
            let dy = points[j][1] - points[i][1]

            if dx == 0 && dy == 0 {
                // 处理重复点
                duplicates += 1
                continue
            }

            // 计算简化的斜率
            let gcd = gcdOf(dx, dy)
            let simplifiedDx = dx / gcd
            let simplifiedDy = dy / gcd

            // 使用字符串作为键存储斜率
            let slopeKey = "\(simplifiedDx)/\(simplifiedDy)"
            slopeCount[slopeKey, default: 0] += 1
            currentMax = max(currentMax, slopeCount[slopeKey]!)
        }

        maxPointsOnLine = max(maxPointsOnLine, currentMax + duplicates)
    }

    return maxPointsOnLine
}

func gcdOf(_ a: Int, _ b: Int) -> Int {
    var a = abs(a), b = abs(b)
    while b != 0 {
        let temp = a % b
        a = b
        b = temp
    }
    return a
}

代码分析

  1. 核心逻辑

    • 使用哈希表存储斜率及其出现次数,避免重复计算。
    • 每次遍历后更新最大点数。
  2. 斜率化简

    • 使用最大公约数(GCD)将斜率标准化,避免浮点误差或精度问题。
  3. 处理特殊情况

    • 对于重复点,将它们合并计入最终结果。
    • 对于垂直线,使用分母为0表示特殊斜率。

示例测试与结果

测试代码

let points1 = [[1, 1], [2, 2], [3, 3]]
let points2 = [[1, 1], [3, 2], [5, 3], [4, 1], [2, 3], [1, 4]]

print(maxPoints(points1)) // 输出: 3
print(maxPoints(points2)) // 输出: 4

测试结果

  • 输入:[[1, 1], [2, 2], [3, 3]]
    输出:3
  • 输入:[[1, 1], [3, 2], [5, 3], [4, 1], [2, 3], [1, 4]]
    输出:4

时间复杂度

  • 外层循环:遍历每个点,复杂度为O(n)
  • 内层循环:计算其他点的斜率,复杂度为O(n)
    总复杂度:O(n^2)

空间复杂度

  • 哈希表的存储空间:O(n)
    总复杂度:O(n)

总结

本文通过基于斜率的哈希表法解决了二维平面上点共线问题。代码利用GCD优化斜率计算并处理特殊情况,既保证了精度,又提高了效率。通过完整的代码和详尽的分析,读者可以轻松掌握该问题的解决思路和实现细节。

关于我们

我们是由 Swift 爱好者共同维护,我们会分享以 Swift 实战、SwiftUI、Swift 基础为核心的技术内容,也整理收集优秀的学习资料。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/927367.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用Ansible自动化部署Zabbix6监控

1、获取Ansible离线部署包 链接&#xff1a;https://pan.baidu.com/s/1EjI02Ni8m9J4eJeBcJ-ZUQ?pwdzabx 提取码&#xff1a;zabx 2、安装Ansible wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo yum -y install ansible3、修改hosts文件…

lua闭包Upvalue

闭包 lua任何函数都是闭包&#xff0c;闭包至少带1个upValue&#xff1b; CClosure是使用Lua提供的lua_pushcclosure这个C-Api加入到虚拟栈中的C函数&#xff0c;它是对LClosure的一种C模拟 如string.gmatch就是cclosure 定义&#xff1a; #define ClosureHeader \CommonH…

二叉搜索树之遍历

二叉搜索树是一种重要的数据结构&#xff0c;它的每个节点最多有两个子节点&#xff0c;称为左子节点和右子节点。 二叉搜索树的特性是&#xff1a;对于树中的每个节点&#xff0c;其左子树中的所有节点的值都小于该节点的值&#xff0c;而右子树中的所有节点的值都大于该节点…

Java基础访问修饰符全解析

一、Java 访问修饰符概述 Java 中的访问修饰符用于控制类、方法、变量和构造函数的可见性和访问权限&#xff0c;主要有四种&#xff1a;public、protected、default&#xff08;无修饰符&#xff09;和 private。 Java 的访问修饰符在编程中起着至关重要的作用&#xff0c;它…

安心护送转运平台小程序

安心护送转运平台小程序是一款基于FastAdminThinkPHPUniapp开发的非急救救护车租用转运平台小程序系统&#xff0c;可以根据运营者的业务提供类似短途接送救护服务&#xff0c;重症病人转运服务&#xff0c;长途跨省护送服务。

人工智能技术在外骨骼机器人中的应用,发展历程与原理介绍

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下 人工智能技术在外骨骼机器人中的应用&#xff0c;发展历程与原理介绍 。外骨骼机器人是一种 套在人体外部的可穿戴机器人装置 &#xff0c;旨在增强人类的身体能力和运动功能。其独特之处在于能够与人体紧密配合&a…

类型转换与IO流:C++世界的变形与交互之道

文章目录 前言&#x1f384;一、类型转换&#x1f388;1.1 隐式类型转换&#x1f388;1.2 显式类型转换&#x1f381;1. C 风格强制类型转换&#x1f381;2. C 类型转换操作符 &#x1f388;1.3 C 类型转换操作符详解&#x1f381;1. static_cast&#x1f381;2. dynamic_cast&…

如何手搓一个智能宠物喂食器

背景 最近家里的猫胖了&#xff0c;所以我就想做个逗猫棒。找了一圈市场上的智能逗猫棒&#xff0c;运行轨迹比较单一&#xff0c;互动性不足。 轨迹单一&#xff0c;活动范围有限 而我希望后续可以结合人工智能物联网&#xff0c;通过摄像头来捕捉猫的位置&#xff0c;让小…

【AI系统】AI 编译器基本架构

AI 编译器基本架构 在上一篇文章中将 AI 编译器的发展大致分为了 3 个阶段&#xff0c;分别为 1&#xff09;朴素编译器、2&#xff09;专用编译器以及 3&#xff09;通用编译器。 本文作为上一篇文章 AI 编译器架构的一个延续&#xff0c;着重讨论 AI 编译器的通用架构。首先…

用 React 编写一个笔记应用程序

这篇文章会教大家用 React 编写一个笔记应用程序。用户可以创建、编辑、和切换 Markdown 笔记。 1. nanoid nanoid 是一个轻量级和安全的唯一字符串ID生成器&#xff0c;常用于JavaScript环境中生成随机、唯一的字符串ID&#xff0c;如数据库主键、会话ID、文件名等场景。 …

#渗透测试#红蓝攻防#HW#漏洞挖掘#漏洞复现01-笑脸漏洞(vsftpd)

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…

Day1——GitHub项目共同开发

MarkDowm解释 Markdown是一种轻量级标记语言&#xff0c;它允许人们使用易读易写的纯文本格式编写文档&#xff0c;然后转换成结构化的HTML代码。Markdown的目的是让文档的编写和阅读变得更加容易&#xff0c;同时也不失HTML的强大功能。以下是Markdown的一些基本概念和用法&a…

【攻防世界】WEB-inget

首先找到该关卡 启动靶场环境 访问靶场 构造一个id参数&#xff0c;尝试访问&#xff0c;无内容回显 使用sqlmap工具&#xff0c;先获取数据库&#xff0c;输入命令sqlmap -u http://61.147.171.105:58893/?id1 --dbs 发现第一个即为所需数据库&#xff0c;接下来进行获取…

【C++】深度剖析经典编程题目:电影票、A+B与鸡兔同笼的解决方案

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;牛牛买电影票问题题目描述解题思路代码实现优化思路总结 &#x1f4af;AB问题题目描述解题思路代码实现代码优化总结 &#x1f4af;鸡兔同笼问题题目描述解题思路数学解法代…

掌上单片机实验室 — RT - Thread+ROS2 浅尝(26)

前面化解了Micro_ROS通讯问题&#xff0c;并在 RT-Thread Studio 环境下&#xff0c;使用Micro_ROS软件包中的例程&#xff0c;实现了STM32F411CE核心板和ROS2主机的通讯。之后还尝试修改例程 micro_ros_sub_twist.c &#xff0c;实现了接收 turtle_teleop_key 所发出的 turtle…

How to monitor Spring Boot apps with the AppDynamics Java Agent

本文介绍如何使用 AppDynamics Java 代理监视 Azure Spring Apps 中的 Spring Boot 应用程序。 使用 AppDynamics Java 代理可以&#xff1a; 监视应用程序使用环境变量配置 AppDynamics Java 代理 在 AppDynamics 仪表板中检查所有监视数据 How to monitor Spring Boot app…

ComfyUI | ComfyUI桌面版发布,支持winmac多平台体验,汉化共享等技巧!(内附安装包)

ComfyUI 桌面版正式推出&#xff0c;支持 Windows 与 macOS 等多平台&#xff0c;为 AI 绘画爱好者带来全新体验。其安装包便捷易用&#xff0c;开启了轻松上手之旅。汉化共享功能更是一大亮点&#xff0c;打破语言障碍&#xff0c;促进知识交流与传播。在操作上&#xff0c;它…

CAD深度清理工具-AVappsDrawingPurge9.0.0(2024.8.27版本) 支持版本CAD2022-2025-供大家学习研究参考

图形文件DWG体积很大&#xff1a;通常没有明显的数据。同时&#xff0c;还其他症状包括&#xff1a; &#xff08;1&#xff09;无法复制和粘贴图元。 &#xff08;2&#xff09;悬挂较长时间选择文本与 “特性”选项板上打开。 &#xff08;3&#xff09;图形文件需要很长时间…

鸿蒙Next星河版基础用例

目录&#xff1a; 1、鸿蒙箭头函数的写法2、鸿蒙数据类型的定义3、枚举的定义以及使用4、position绝对定位及层级zIndex5、字符串的拼接转换以及数据的处理(1)字符串转数字(2)数字转字符串(3)布尔值转换情况(4)数组的增删改查 6、三元表达式7、鸿蒙for循环的几种写法7.1、基本用…

Spring的事务管理

tx标签用于配置事务管理用于声明和配置事务的相关属性 transaction-manager指定一个事务管理器的引用&#xff0c;用于管理事务的生命周期。propagation指定事务的传播属性&#xff0c;决定了在嵌套事务中如何处理事务。isolation指定事务的隔离级别&#xff0c;用于控制事务之…