当前位置: 首页 > news >正文

学做网站论坛熊掌深圳网站seo优化排名公司

学做网站论坛熊掌,深圳网站seo优化排名公司,网站举报在哪举报,wordpress电影模板下载优质博文:IT-BLOG-CN 题目 给你一个数组points,其中points[i] [xi, yi]表示X-Y平面上的一个点。求最多有多少个点在同一条直线上。 示例 1: 输入:points [[1,1],[2,2],[3,3]] 输出:3 示例 2: 输入&am…

优质博文:IT-BLOG-CN

题目

给你一个数组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中的所有点 互不相同

代码

方法一:哈希表

思路及解法

我们可以考虑枚举所有的点,假设直线经过该点时,该直线所能经过的最多的点数。

假设我们当前枚举到点 i,如果直线同时经过另外两个不同的点 j 和 k,那么可以发现点 i 和点 j 所连直线的斜率恰等于点 i 和点 k 所连直线的斜率。

于是我们可以统计其他所有点与点 i 所连直线的斜率,出现次数最多的斜率即为经过点数最多的直线的斜率,其经过的点数为该斜率出现的次数加一(点 i 自身也要被统计)。

如何记录斜率

需要注意的是,浮点数类型可能因为精度不够而无法足够精确地表示每一个斜率,因此我们需要换一种方法来记录斜率。

一般情况下,斜率可以表示为在这里插入图片描述的形式,因此我们可以用分子和分母组成的二元组来代表斜率。但注意到存在形如1/2 = 2/4 这样两个二元组不同,但实际上两分数的值相同的情况,所以我们需要将分数 在这里插入图片描述化简为最简分数的形式。

将分子和分母同时除以二者绝对值的最大公约数,可得二元组在这里插入图片描述。令 在这里插入图片描述
,则上述化简后的二元组为 (mx,my)。此外,因为分子分母可能存在负数,为了防止出现形如 −1/ 2 = 1/−2
的情况,我们还需要规定分子为非负整数,如果 my 为负数,我们将二元组中两个数同时取相反数即可。

特别地,考虑到 mx 和 my 两数其中有一个为 0 的情况(因为题目中不存在重复的点,因此不存在两数均为 0 的情况),此时两数不存在数学意义上的最大公约数,因此我们直接特判这两种情况。当 mx 为 0 时,我们令 my=1;当 my 为 0 时,我们令 mx=1 即可。

经过上述操作之后,即可得到最终的二元组 (mx,my)。在本题中,因为点的横纵坐标取值范围均为 [−104,104],所以斜率 slope=
mx/my中,mx 落在区间 [−2×104,2×104] 内,my 落在区间 [0,2×104] 内。注意到 32 位整数的范围远超这两个区间,因此我们可以用单个 32 位整型变量来表示这两个整数。具体地,我们令 val=my+(2×104+1)×mx 即可。

优化

最后我们再加四个小优化:

在点的总数量小于等于 2 的情况下,我们总可以用一条直线将所有点串联,此时我们直接返回点的总数量即可;
当我们枚举到点 i 时,我们只需要考虑编号大于 i 的点到点 i 的斜率,因为如果直线同时经过编号小于点 i 的点 j,那么当我们枚举到 j 时就已经考虑过该直线了;
当我们找到一条直线经过了图中超过半数的点时,我们即可以确定该直线即为经过最多点的直线;
当我们枚举到点 i(假设编号从 0 开始)时,我们至多只能找到 n−i 个点共线。假设此前找到的共线的点的数量的最大值为 k,如果有 k≥n−i,那么此时我们即可停止枚举,因为不可能再找到更大的答案了。

class Solution {public int maxPoints(int[][] points) {int n = points.length;if (n <= 2) {return n;}int ret = 0;for (int i = 0; i < n; i++) {if (ret >= n - i || ret > n / 2) {break;}Map<Integer, Integer> map = new HashMap<Integer, Integer>();for (int j = i + 1; j < n; j++) {int x = points[i][0] - points[j][0];int y = points[i][1] - points[j][1];if (x == 0) {y = 1;} else if (y == 0) {x = 1;} else {if (y < 0) {x = -x;y = -y;}int gcdXY = gcd(Math.abs(x), Math.abs(y));x /= gcdXY;y /= gcdXY;}int key = y + x * 20001;map.put(key, map.getOrDefault(key, 0) + 1);}int maxn = 0;for (Map.Entry<Integer, Integer> entry: map.entrySet()) {int num = entry.getValue();maxn = Math.max(maxn, num + 1);}ret = Math.max(ret, maxn);}return ret;}public int gcd(int a, int b) {return b != 0 ? gcd(b, a % b) : a;}
}

时间复杂度: O(n2 × log m),其中 n 为点的数量,m 为横纵坐标差的最大值。最坏情况下我们需要枚举所有 n 个点,枚举单个点过程中需要进行 O(n) 次最大公约数计算,单次最大公约数计算的时间复杂度是 O(logm),因此总时间复杂度为 O(n2 × logm)。

空间复杂度: O(n),其中 n 为点的数量。主要为哈希表的开销。

http://www.yayakq.cn/news/161570/

相关文章:

  • 天津企业网站建设一条龙银行网站模板免费下载
  • 杭州网站建设公司排名用狗做头像的网站
  • 深圳做微商网站设计盘锦做网站哪家好
  • 呼和浩特建设局网站百度快速查询
  • 网站建设方案书 模板二维码短链接生成器
  • 可以做mv 的视频网站华夏建筑工程网
  • 影视网站建设要多少钱网站免费推广大全
  • 做电商的常去网站西安建设局网站小孩把
  • 杭州建网站号码之家官网
  • 官方网站案例荣耀手机官方商城官网
  • wordpress 流量站兄弟们给个能用的网站
  • 网站新闻对百度优化有用吗做图片视频的网站有哪些问题
  • 最新站长seo网站外链发布平台厦门seo排名优化方式
  • 企业网站推广免费建网站那个好
  • 网站开发公司选择扬州建设网站公司
  • 网站运营模式建设部网站资质升级陈述通过
  • 关于公司网站建设的若干意见网站设计制作策划
  • 网站建设微信开发wordpress 自定义鼠标
  • 动易网站开发的主要技术做网站怎么插音频
  • 雅安建设局网站山东省郓城县建设局官方网站
  • 温州外贸网站设计昵图设计师服务平台
  • 权威网站优化价格济南做网站最好的公司
  • 对网站建设好学吗淘宝优惠群的网站是怎么做
  • 教师网站建设机培训体会免费下载设计网站页面步骤
  • 公司网站怎么做教程做视频网站用哪个cms
  • 什么是营销网络网站建设和优化的营销话术
  • 做会计网站的流程图如何防止别人攻击自己的网站
  • 做图海报网站仿5173网站
  • 活动发布类网站开发国内新闻最新5条
  • 新加坡网站开发公司眼查看网站开发语言