给出
题目描述
二维平面,求出平面上有n个点,最多有几个点在同一直线上。
示例
输入:^
|
| o
| o o
| o
| o o
-------------
0 1 2 3 4 5 6输出:
4
写在前面
从本论文解答参考(Ctrl CV ) LeetCode公式问题中求解。
解法:两点同线
想法的转换:找出通过点I的直线,使之通过最多的点。每个点I,计算该点以后的点和点I的连接线的斜率,用哈希表记录,成为相同斜率时,在计数器上加1。
之所以只考虑现在点之后的点,是因为通过点i-1和点i-2的直线已经在搜索点i-2的过程中被考虑了。
代码
官方这次写的代码有点奇怪,还是我的水平不够? 思考类解决方案{2}
int点;
铟锡;
HashMapDouble,Integer lines=新HashMapDouble,integer (;
英国石油公司;
公共对集成器、集成_线(整数、整数、整数、整数) {
/*
addalinepassingthroughiandjpoints。
updatemaxnumberofpointsonalinecontainingpointi。
updateanumberofduplicatesofipoint。
*/
//rewrite点作为协调者
int x1=点[ I ] [0];
int y1=点;
int x2=点[ j ] [0];
int y2=点;
//添加复制点
if () y1==y2) ) y1==y2) )
复制;
//Addahorisontalline : y=常数
elseif(y1==y2) {
霍利森塔尔_ Lines=1;
count=math.max (地平线,计数);
}
//添加线: x=斜率* y c
//Onlyslopeisneededforahash-map
//sincewealwaysstartfromthesamepoint
else {2}
双斜率=1.0 * (x1-x2 )/) y1-y2 ) 0.0;
lines.put (斜率,lines.getordefault )斜率,1 ) 1;
count=math.max (线路. get (坡度),计数);
}
返回新支付(计数,重复);
}
公共信息点_在线_连续_点I
/*
计算最大编号为点
适用于线上维修点I。
*/
//initlinespassingthroughpointi
lines.clear (;
霍利森塔尔_ Lines=1;
//onestartswithjustonepointonaline :点。
int计数=1;
//thereisnoduplicatesofapointisofar。
int双工=0;
//computelinespassingthroughpointi (固定) )。
//andpointj (交换)。
//updateinaloopthenumberofpointsonaline
//andthenumberofduplicatesofpointi。
for(intj=I1; j-n; j ) {2}
配对整合器,整合器=添加_线(I,j,计数,复制);
count=p.getKey (;
duplicates=p.getValue (;
}
返回计数复制;
}
publicintmaxpoints (int点)
this.points=points;
//ifthenumberofpointsislessthan 3
//they are all on the same line (除此之外,其他所有线路都是这样)。
n=点长度;
是if(n3)
返回n;
int max_count=1;
//computeinaloopamaxnumberofpoints
//在线容器点I。
for (英制=0; I-1; I ) )
max _ count=math.max (最大点在线连接点(I ),最大计数);
返回最大计数;
}
}
作者: leet代码
链接: https://leet代码- cn.com /问题/a线上最大点/解决方案/zhi-shan-zui -双核- Didie
资料来源:力量按钮(leet代码)。