一条线上的点

ops/2024/12/18 8:51:56/

给你一个数组 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.ppmy.cn/ops/142861.html

相关文章

Python监控AWS ECS集群和服务的CPU和内存利用率

在电子商务或其他行业,重要节日通常会带来大量的流量和订单,这对应用程序的资源利用率提出了更高的要求。为了确保应用程序在节日期间能够顺利运行,提前监控和优化资源利用率至关重要。 在本文中,我们将介绍如何使用Python编写一个脚本,从AWS CloudWatch中获取ECS集群和服务的…

分享7 个用 Python 开发成的数据库

Python 作为一种高层次的编程语言&#xff0c;因其简单易用和强大的社区支持&#xff0c;被用于实现多种类型的数据库。这些数据库可以分为几大类&#xff0c;包括关系型数据库、NoSQL 数据库、嵌入式数据库和面向对象数据库等。下面这些数据库不常用&#xff0c;看可以通过学习…

性能评估工具之lmbench

目录 一、概括二、lmbench 一、概括 嵌入式开发中对要设计的产品、立项的项目进行设计时&#xff0c;往往需要对关键芯片进行性能评估&#xff0c;本文主要总结基于linux系统的产品在性能评估时的工具使用总结&#xff0c;在aarch64(arm64平台下测试)&#xff0c;板卡根文件系…

Java-08

类的抽象是将类的实现和使用分离, 而类的封装是将实现的细节封装起来并且对用户隐藏,用户只需会用就行。 类的合约指的是从类外可以访问的方法和数据域的集合以及与其这些成员如何行为的描述 isAlive()方法的返回值类型为布尔型&#xff08;Boolean&#xff09;。这个方法用于…

MySQL数据读取机制:内存缓存与磁盘I/O的协同工作

从MySQL获取数据并不总是直接从磁盘读取。MySQL使用了内存缓存技术来加速数据的访问&#xff0c;具体过程如下&#xff1a; 一、内存缓存机制 MySQL&#xff0c;特别是其InnoDB存储引擎&#xff0c;有一个关键的内存区域称为Buffer Pool&#xff08;缓冲池&#xff09;。Buff…

分享两个爬虫练习网站+一个python游戏网站

目录 第一个网站第二个Python游戏网站 第一个网站 网站一 第二个 网站二 Python游戏网站 网站三

Linux文件操作基础

1.引入 在Linux第一章提到过&#xff0c; 在Linux中&#xff0c;一切皆文件&#xff0c;而文件由文件内容和文件属性组成&#xff0c;在C语言中可以 使用相应的接口打开文件&#xff0c;例如 fopen 函数 文件最开始在磁盘中&#xff0c;但是因为磁盘的速度远低于CPU的执行速度…

mysql flink cdc 实时数据抓取

背景 通过监控mysql日志&#xff0c;获取表字段更新&#xff0c;用来做实时展示。 使用技术&#xff1a;Flink CDC Flink CDC 基于数据库日志的 Change Data Caputre 技术&#xff0c;实现了全量和增量的一体化读取能力&#xff0c;并借助 Flink 优秀的管道能力和丰富的上下游…