美文网首页
LintCode直线对称

LintCode直线对称

作者: Sczlog | 来源:发表于2018-12-31 17:47 被阅读5次

    给定二维平面上的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函数执行需要时间,这个时间远超于排序算法本身需要的时间了。

    相关文章

      网友评论

          本文标题:LintCode直线对称

          本文链接:https://www.haomeiwen.com/subject/dbkwlqtx.html