一条线上的点

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

提示:

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

解析:使用斜率(slope)来确定两点之间的直线,并通过哈希表(dict)来记录每个斜率对应点的数量对于每一个点,我们可以计算它与其他所有点之间的斜率

遍历每个点-->处理斜率-->处理重合点-->更新最大值-->求出结果并返回

代码实现如下

from fractions import Fraction
from collections import defaultdictdef maxPoints(points):def slope(p1, p2):# 如果两点重合if p1 == p2:return None# 如果两点在同一垂直线上if p1[0] == p2[0]:return float('inf')# 使用 Fraction 来避免浮点数精度问题return Fraction(p2[1] - p1[1], p2[0] - p1[0])if len(points) <= 2:return len(points)max_points = 0for i in range(len(points)):slopes = defaultdict(int)same_point_count = 1  # 计算与当前点重合的点的数量for j in range(i + 1, len(points)):if points[i] == points[j]:same_point_count += 1else:s = slope(points[i], points[j])slopes[s] += 1# 当前点的最大共线点数 = 重合点数 + 最多相同斜率的点数current_max = same_point_count + (max(slopes.values(), default=0) if slopes else 0)max_points = max(max_points, current_max)return max_points# 示例用法:
print(maxPoints([[1,1],[2,2],[3,3]]))  # 输出: 3
print(maxPoints([[1,1],[3,2],[5,3],[4,1],[2,3],[1,4]]))  # 输出: 4

1. slope 函数:

用于计算两个点之间的斜率。如果两点重合,返回 None;如果两点在同一垂直线上,返回 float('inf');否则,使用 Fraction 来计算斜率。

2. maxPoints 函数:

遍历每个点 points[i],将其作为起点。
对于每个起点,初始化一个 defaultdict 来记录不同斜率出现的次数,并初始化 same_point_count 来记录与当前点重合的点的数量
遍历其他点 points[j],计算斜率并更新 slopes 和 same_point_count
计算当前点的最大共线点数,并更新全局最大值 max_points。

3. 返回结果:

最终返回全局最大值 max_points。
这种方法的时间复杂度为 On2,因为我们使用了哈希表来存储斜率。

优化建议:

 提前终止、减少重复计算、优化斜率计算、优化斜率计算

1. 提前终止:

如果在遍历过程中,当前点的最大共线点数已经达到了 n,则可以直接返回结果,因为不可能有更多点在同一条直线上。

如果在某个点的遍历中,当前的最大共线点数已经超过了之前的所有结果,可以提前终止对该点的进一步处理。

2. 减少重复计算:

使用缓存来存储已经计算过的斜率,避免重复计算。

对于重合点,可以在第一次遇到时直接跳过后续的比较,减少不必要的计算。

3. 优化斜率计算:

使用 Fraction 来避免浮点数精度问题,但也可以考虑使用整数除法来简化斜率的表示。例如,对于斜率 (dy, dx),可以直接使用 (dy, dx) 的最小公倍数来表示斜率,而不需要使用 Fraction。

4. 并行化:

如果硬件支持多线程或分布式计算,可以将点的遍历过程并行化,从而加速计算。不过,这并不会改变时间复杂度,但可以在实际运行中提高效率。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

XX服务器上的npm不知道咋突然坏了

收到同事的V&#xff0c;说是&#xff1a;182上的npm不知道咋突然坏了&#xff0c;查到这里了&#xff0c;不敢动了。 咱一定要抓重点&#xff1a;突然坏了。这里的突然肯定不是瞬间&#xff08;大概率是上次可用&#xff0c;这次不可用&#xff0c;中间间隔了多长时间&#x…

GNSS定位局限性与综合PNT及5G定位技术研究

摘要 本文主要介绍了GNSS定位技术的系统组成与原理、发展历程、应用领域及现状&#xff0c;并分析了其存在的局限性&#xff0c;如信号遮挡、多路径效应、大气层干扰等。文章还探讨了综合PNT技术的体系架构、多源信息融合方法以及智能化算法在PNT中的应用&#xff0c;强调了综…

/hbase/oldWALs 文件

/hbase/oldWALs 是 HBase 中的一个目录&#xff0c;用于存储那些不再需要用于恢复目的的 WAL&#xff08;Write-Ahead Log&#xff09;文件。这些文件在 HBase 确认所有的数据都已经从 MemStore 持久化到 HFile 之后&#xff0c;会被移动到这个目录。 /hbase/oldWALs 目录中的…

HALCON 算子 之 形态学操作算子

文章目录 什么是形态学操作&#xff1f;为什么要形态学操作&#xff1f;怎么形态学操作&#xff1f;腐蚀 —— Erosionerosion1erosion_circle&#xff1a;erosion_rectangle1&#xff1a; 膨胀 —— Dilationdilation1dilation_circledilation_rectangle1 打开 —— Openingop…

[金盾杯 2024] PWN 复现

好长时间不作题了&#xff0c;在复现平台上看到这个比赛&#xff0c;作了一下&#xff0c;题过于简单了。不过密码一言难尽。 Orange 要说libc-2.23有多老&#xff0c;我一开始学PWN的时候还有不少&#xff0c;这两年几乎不见了。一些比赛估计是拿的旧题。 远看像个堆题&…

pytest入门九:feature

fixture是pytest特有的功能&#xff0c;用以在测试执行前和执行后进行必要的准备和清理工作。使用pytest.fixture标识&#xff0c;定义在函数前面。在你编写测试函数的时候&#xff0c;你可以将此函数名称做为传入参数&#xff0c;pytest将会以依赖注入方式&#xff0c;将该函数…

uniapp Vue3 语法实现浏览器中音频录制、停止、保存、播放、转码、实时音频输出

一、引言 在现代 Web 应用开发中,音频处理功能变得越来越重要。本文将详细介绍如何使用 uniapp 结合 Vue3 语法在浏览器环境中实现音频录制、停止、保存、播放、转码以及实时音频输出等一系列功能。通过深入剖析代码结构和功能实现细节,帮助读者全面理解和掌握相关技术,以便…

【jpa】会什么jpa会自动新建一个hibernate_sequence表

目录 1. 说明2. 主键生成策略3. hibernate_sequence表的创建4. 如何避免自动创建hibernate_sequence表 1. 说明 1.JPA&#xff08;Java Persistence API&#xff09;在默认情况下&#xff0c;如果使用Hibernate作为持久化框架&#xff0c;并且没有显式指定主键生成策略&#x…

秒优科技-供应链管理系统 login/doAction SQL注入漏洞复现

0x01 产品简介 秒优科技提供的供应链管理系统,即秒优SCM服装供应链管理系统,是一款专为服装电商企业设计的全方位解决方案。是集款式研发、订单管理、物料管理、生产管理、工艺管理、收发货管理、账单管理、报表管理于一体的服装电商供应链管理解决方案。它涵盖了从企划到开…

【TF-IDF】Hugging Face Model Recommendation System

利用了机器学习技术的模型检索 TF-IDF (Term Frequency-Inverse Document Frequency) 文本特征提取例子This project is a Hugging Face Model Recommendation System designed to assist users in discovering the most suitable models based on their task descriptions. Th…

136.WEB渗透测试-信息收集-小程序、app(7)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;135.WEB渗透测试-信息收集-小程序、app&#xff08;6&#xff09; 进入之后我们通过输入…

samout llm解码 幻觉更低更稳定

这段代码定义了一个简单的对话生成系统&#xff0c;包括模型加载、词汇表加载、以及基于给定提示生成文本的功能。下面是对代码的解析&#xff1a; load_model_and_voc(device"cpu"): 该函数用于加载预训练的模型和词汇表&#xff08;vocabulary&#xff09;。它首先…

K近邻原理和距离

K近邻 基本思想欧氏距离算法流程代码基于近邻用户的协同过滤基于近邻物品的协同过滤杰卡德相似度 基本思想 我们根据涂色样本点和未涂色样本点 X 的距离给涂色样本点编号1-6&#xff0c;即&#xff1a;1号样本点距离X最近&#xff0c;其余次之。 那么问题来了&#xff1a;样本…

Transformer 中 Self-Attention 的二次方复杂度(Quadratic Complexity )问题及改进方法:中英双语

Transformer 中 Self-Attention 的二次方复杂度问题及改进方法 随着大型语言模型&#xff08;LLM&#xff09;输入序列长度的增加&#xff0c;Transformer 结构中的核心模块——自注意力机制&#xff08;Self-Attention&#xff09; 的计算复杂度和内存消耗都呈现二次方增长。…

模型 A/B测试(科学验证)

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。控制变量法。 1 A/B测试的应用 1.1 Electronic Arts&#xff08;EA&#xff09;《模拟城市》5游戏网站A/B测试 定义目标&#xff1a; Electronic Arts&#xff08;EA&#xff09;在发布新版《模拟城…

Java修饰符详解:从基础到高级用法

在Java编程语言中&#xff0c;有许多修饰符可以使用&#xff0c;它们大致可以分为两大类&#xff1a;访问控制修饰符、其他类型的修饰符。 这些修饰符主要用于指定类、方法或变量的特性&#xff0c;并且通常位于声明语句的开头部分。下面通过一些示例来进一步说明这一点&#…

onnx文件转pytorch pt模型文件

onnx文件转pytorch pt模型文件 1.onnx2torch转换及测试2.存在问题参考文献 从pytorch格式转onnx格式&#xff0c;官方有成熟的API&#xff1b;那么假如只有onnx格式的模型文件&#xff0c;该怎样转回pytorch格式&#xff1f; https://github.com/ENOT-AutoDL/onnx2torch提供了…

Git merge 和 rebase的区别(附图)

在 Git 中&#xff0c;merge 和 rebase 是两种用于整合分支变化的方法。虽然它们都可以将一个分支的更改引入到另一个分支中&#xff0c;但它们的工作方式和结果是不同的。以下是对这两者的详细解释&#xff1a; Git Merge 功能&#xff1a;合并分支&#xff0c;将两个分支的…

【Web】0基础学Web—js运算符、选择结构、循环结构

0基础学Web—js运算符、选择结构、循环结构 js运算符选择结构循环结构 js运算符 算术运算符: - * / %取余 赋值运算符: - * / % 单目运算符: i i --i i– 单独使用是自增1 或 自减1 如果被使用&#xff0c;先看到啥先操作啥 比较运算符&#xff1a; > 、 >、 < 、…

系列3:基于Centos-8.6 Kubernetes使用nfs挂载pod的应用日志文件

每日禅语 古代&#xff0c;一位官员被革职遣返&#xff0c;心中苦闷无处排解&#xff0c;便来到一位禅师的法堂。禅师静静地听完了此人的倾诉&#xff0c;将他带入自己的禅房之中。禅师指着桌上的一瓶水&#xff0c;微笑着对官员说&#xff1a;​“你看这瓶水&#xff0c;它已经…