【LeetCode】149. Max Points on a Line - javascript

提交效率:192 ms ,55%

这一题,出现了 javascript 精度问题。最后的案例 [[0,0],[94911151,94911150],[94911152,94911151]] 是没法通过的。会将会两个点计算为同一个斜率的,造成结果的不对。

94911150 / 94911151 = 0.9999999894638303 == 94911151 / 94911152

这里写图片描述

var maxPoints = function(points) {
    if(points.length<2 ) return points.length;
    var result = {"ins":0};
    var max = 0;
    for(var j = 0 ; j < points.length; j++){
        result = {"ins":0},base = 1,onthis = false;
        for(var i = 0, temp; i< points.length; i++){
            if(points[i].x == points[j].x){
                // 每多一个同点,所有点数加1
                if(points[i].y == points[j].y){
                    for(var key in result){
                        result[key]++;
                    }
                    max = onthis? max+1:max;

                    base++;
                }else{
                    result["ins"]++;
                }
               max = result["ins"] > max ? result["ins"] : max;
                continue;
            }
            temp = (points[i].y - points[j].y)/(points[i].x - points[j].x);
            result[temp] ? (result[temp]++):(result[temp] = base);    
            result[temp] > max ? ( max = result[temp] ,onthis = true) : null;
        } 
    } 
    return max;
};

参考排名第一的方法,使用其它方式表示斜率:

var maxPoints = function(points) {
    let size = points.length;
    if (size < 2) return size;
    const gcd = (a, b) => {
        if (b === 0) return a;
        return gcd(b, a%b);
    }
    let res = 0;
    for (let i = 0; i < size; ++i) {
        let hash = new Map();
        let horizontal = 0, vertical = 0, localMax = 0, overlap = 1;
        for (let j = i + 1; j < size; ++j) {
            let a = points[i], b = points[j];
            if (a.x === b.x && a.y === b.y) ++overlap;
            else if (a.x === b.x) ++vertical;
            else if (a.y === b.y) ++horizontal;
            else {
                let dx = a.x - b.x;
                let dy = a.y - b.y;
                let d = gcd(dx, dy);
                dx = Math.floor(dx / d);
                dy = Math.floor(dy / d);
                let pair = "" + dx + "," + dy;
                let curPoints = hash.has(pair) ? hash.get(pair) + 1 : 1;
                hash.set(pair, curPoints);
                localMax = Math.max(localMax, curPoints);
            }
        }
        res = Math.max(res, overlap + Math.max(localMax, Math.max(vertical, horizontal)));
    }
    return res;
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值