LintCode直線對(duì)稱

給定二維平面上的n點(diǎn),找出是否有這樣一條與y軸平行的線使所有點(diǎn)對(duì)稱。

題目在此,被提點(diǎn)的一題,因?yàn)橐槐檫^(guò)就沒(méi)考慮太多,發(fā)現(xiàn)自己的時(shí)長(zhǎng)比較久。

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軸平行的對(duì)稱線說(shuō)明對(duì)稱的兩點(diǎn)y值相等,x值相加為平行線與x軸交點(diǎn)的截距*2。
理所應(yīng)當(dāng)?shù)木妥隽伺判?,然而沒(méi)必要做排序,這也是我時(shí)間長(zhǎng)的原因所在。
看了一下筆記,發(fā)現(xiàn)可以用Map來(lái)取代排序,在JS里可以合理的利用object的性質(zhì)來(lái)做(類似于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;
}

時(shí)間從排序的1041ms直接到了201ms,理論上O(n)到O(n*logn),不應(yīng)該有這么大的差距。
我覺(jué)得是sort中的compare函數(shù)執(zhí)行需要時(shí)間,這個(gè)時(shí)間遠(yuǎn)超于排序算法本身需要的時(shí)間了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容