直线上最多的点数
程序员文章站
2022-03-27 09:38:23
...
题目描述:
给定一个二维平面,平面上有 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大数除法精度不够最后一条测试案例直接走捷径了
这道题是真的坑。
推荐阅读
-
刘备一直以来都是以仁义之师著称 为什么他手下的叛徒最多呢
-
【Leetcode】149. Max Points on a Line 149. 直线上最多的点数
-
刘备一直以来都是以仁义之师著称 为什么他手下的叛徒最多呢
-
直线上最多的点数
-
leetcode 给定二维平面上的n个点,找到位于同一直线上的最大点数
-
编程题—给定位于二维平面上的n个点,求出位于同一条直线上的最大点数
-
给定二维平面上的n个点,找到位于同一直线上的最大点数
-
LeetCode:对于给定的n个位于同一二维平面上的点,求最多能有多少个点位于同一直线上
-
给定2D平面上的n个点,找到位于同一直线上的最大点数
-
Leetcode打卡2:对于给定的n个位于同一二维平面上的点,求最多能有多少个点位于同一直线上