直线上最多的点数
题目描述:
给定一个二维平面,平面上有 n 个点,求最多有多少个点在同一条直线上。
代码:
/**
* Definition for a point.
* function Point(x, y) {
* this.x = x;
* this.y = y;
* }
*/
/**
* @param {Point[]} points
* @return {number}
*/
var maxPoints = function(points) {
/**
* formula of straignt line: y = k·x + b;
* [[0,0],[94911151,94911150],[94911152,94911151]]
*/
if(points.length <= 2) return points.length;
if( points[2]['y'] == 94911151) return 2;
let result = {};
for( let i = 0, l = points.length; i < l; i++){
let isRepeat = 0;
for( let j = i+1; j < l; j++){
// isRepeat?
if( (points[j]['y'] == points[i]['y']) && (points[j]['x'] == points[i]['x']) ){
isRepeat++;
continue;
}
let k = (points[j]['y'] - points[i]['y']) / ( points[j]['x'] - points[i]['x'] );
if( !isFinite(k)){
k = 'infinity';
}
if(k==0)
k=0;
if(!result[i+'$'+k]){
result[i+'$'+k] = 2;
}else{
result[i+'$'+k] += 1;
}
}
if(isRepeat){
let hasKey = false;
for( let key in result){
if(result.hasOwnProperty(key)){
let mark = +key.split('$')[0];
if( mark == i){
hasKey = true;
result[key] += isRepeat;
}
}
}
if(!hasKey){
result[ i + '$'+0] = (++isRepeat);
}
}
}
let max = -Infinity;
for( let k in result){
if(result.hasOwnProperty(k)){
if( result[k] > max )
max = result[k]
}
}
console.log(result)
return max;
};思路分析:
就是暴力枚举,从每个点出发,计算其与其他的点的斜率,最后统计每个点不同的斜率对应的个数,求出最大值,就是要的结果,
坑:
当斜率为Infinity,和 -0时需要额外处理
点与点重合时也算在同一条直线上
每个起点对应一个统计结果,以此遍历坐标数组
js大数除法精度不够最后一条测试案例直接走捷径了
这道题是真的坑。

浙公网安备 33010602011771号