LintCode直线对称

2018-12-31  本文已影响5人  Sczlog

给定二维平面上的n点,找出是否有这样一条与y轴平行的线使所有点对称。

题目在此,被提点的一题,因为一遍过就没考虑太多,发现自己的时长比较久。

const isReflected = function (points) {
    // Write your code here
    if(points.length==0){
        return true;
    }
    points.sort((a,b)=>a[0]-b[0]);
    var mid = points.length % 2 === 0?(points[points.length/2][0]+points[(points.length/2)-1][0]):points[(points.length-1)/2][0]*2;
    for(var i = 0;i<points.length-i-1;i++){
        if(points[i][0]+points[points.length-i-1][0]!==mid||points[i][1]!==points[points.length-i-1][1])
            return false;
    }
    return true;
}

解题很方便,和Y轴平行的对称线说明对称的两点y值相等,x值相加为平行线与x轴交点的截距*2。
理所应当的就做了排序,然而没必要做排序,这也是我时间长的原因所在。
看了一下笔记,发现可以用Map来取代排序,在JS里可以合理的利用object的性质来做(类似于Map):

const isReflected = function (points) {
    // Write your code here
    if(points.length==0){
        return true;
    }
    var obj = {};
    var max = Number.MIN_SAFE_INTEGER;
    var min = Number.MAX_SAFE_INTEGER;
    points.forEach(p=>{
        obj[p[0]] = p[1]; 
        if(max<p[0]){
            max = p[0];
        }
        if(min>p[0]){
            min = p[0];
        }
    })
    var mid = max+min;
    for(var i = 0;i<points.length;i++){
        if(!(Number(obj[mid-points[i][0]])===obj[mid-points[i][0]])||obj[points[i][0]]!==obj[mid-points[i][0]]){
            return false;
        }
    }
    return true;
}

时间从排序的1041ms直接到了201ms,理论上O(n)到O(n*logn),不应该有这么大的差距。
我觉得是sort中的compare函数执行需要时间,这个时间远超于排序算法本身需要的时间了。

上一篇下一篇

猜你喜欢

热点阅读