手机版
网站地图
美文美图
最新动态
你好,欢迎访问
好美文阅读网
个性皮肤
搜索
网站首页
美文
文章
散文
日记
诗歌
小说
故事
句子
作文
签名
祝福语
情书
范文
读后感
文学百科
美文摘抄
节日文章
名家散文
网名大全
座右铭
口号大全
面试技巧
说说大全
阅读答案
诗词默写
流言蜚语
节日祝福
好句子
经典台词
谚语大全
亲情故事
友情故事
表白情书
工作报告
活动总结
心得体会
专题汇总
美文网首页
Leetcode 149. 直线上最多的点数
Leetcode 149. 直线上最多的点数
作者:
枫叶忆
| 来源:发表于
2019-06-03 10:27 被阅读0次
给定一个二维平面,平面上有
n
个点,求最多有多少个点在同一条直线上。
分析:
暴力破解
根据两点确定一条直线原理,我们可以选取两个点确定一条直线,再看看其他的点有多少位于这条直线上
第一,斜率的计算,如果用除法计算斜率,会有斜率为无穷大的问题,另外除法的结果是浮点数,可能会有不精确的问题,所以我们使用乘法来进行斜率的比较,当然乘法也要注意,int的乘法结果可能会超出上限,要用long来保存乘法结果
第二,重复点的问题,如果一开始选取用来确定一条直线的两个点是重复点就会造成问题,应该跳过这种情况
代码:
/**
* Definition for a point.
* class Point {
* int x;
* int y;
* Point() { x = 0; y = 0; }
* Point(int a, int b) { x = a; y = b; }
* }
*/
public class Solution {
public int maxPoints(Point[] points) {
// 如果总坐标点少于 3 个,直接返回答案
int n = points.length;
if (points.length <= 2) return n;
// 搜索直线上最多的点数
int max = 0;
for (int i = 0; i < n; i ++) {
// same 表示有多少个和 i 一样的点
int same = 1;
for (int j = i + 1; j < n; j ++) {
// cnt 表示除了 i 坐标点外,有多少个点在 i、j 坐标点构成的直线上
int cnt = 0;
if (points[i].x == points[j].x && points[i].y == points[j].y) {
// i、j 是重复点,计数
same ++;
} else {
// i、j 不是重复点,检查其他点是否在这条直线上,j 坐标点也在这条直线上,所以 cnt ++
cnt ++;
long xDiff = (long)(points[i].x - points[j].x);
long yDiff = (long)(points[i].y - points[j].y);
for (int k = j + 1; k < n; k ++) {
if (xDiff * (points[i].y - points[k].y) == yDiff * (points[i].x - points[k].x)) {
cnt ++;
}
}
}
// 最大值比较
max = Math.max(max, cnt + same);
}
}
return max;
}
}
相关文章
网友评论
本文标题:
Leetcode 149. 直线上最多的点数
本文链接:
https://www.haomeiwen.com/subject/kymotctx.html
延伸阅读
那年盛夏诗歌
环境监察队工作总结范文
优秀教师学习心得范文
华胥引的读后感300字
《Its red》教学反思范文
农资购销的合同范本
竞选中队委优秀演讲稿
辞金蹈海的成语解释
《世纪宝鼎》公开课教案设计
因为爱你,所以牵挂
今生今世红尘醉——美到
一个90后的内心独白
致已逝去的高中年华
深度阅读
您也可以注册成为美文阅读网的作者,发表您的原创作品、分享您的心情!
情人节
母亲节
重阳节
清明节
端午节
植树节
元宵节
妇女节
愚人节
圣诞节
父亲节
教师节
儿童节
劳动节
青年节
建军节
万圣节
平安夜
光棍节
中秋节
国庆节
感恩节
腊八节
更多话题
栏目导航
摄影
故事
互联网
读书
旅行
热点阅读
高效学习的底层能力
【无戒学堂】 相亲记(二十二)
美丽的世界
绘本讲师训练营【29期】原创阅读20/21《我不知道我是谁》
这个世界,不一样的六一儿童节
养蜂人应做良心人 养蜂事实为良心事
The Batman
魔都日记
若使曾经不见面(七绝.平水韵)
关于我的舍友高崇飞
网友评论