Leetcode 685. Redundant Connection II Javascript

pimkle發表於2018-12-18

題意

原題連結
給一些有向線,找出那剛好多出的一根,使之成為樹。

思路

  • 1、 找有 2 個 parent 拎出來 當成備選
  • 2、 超出 環 當成備選

程式碼

效率低了 不好意思

/**
 * @param {number[][]} edges
 * @return {number[]}
 */
var findRedundantDirectedConnection = function(edges) {
    // 先找一個子有多個父節點的情況
    let len = edges.length;
    let lenMinus1 = len - 1;
    let candidates = new Set(); // 有問題的陣列們
    for(let i = 0; i < lenMinus1; ++i) {
        let obj1 = edges[i];
        for(let j = i + 1; j < len; ++j) {
            let obj2 = edges[j];
            if(obj1[1] === obj2[1]) {
                candidates.add(i);
                candidates.add(j);
            }
        }
    }
    candidates = [...candidates];
    candidates.sort((a, b) => b - a); // 序號從大到小排
    let lenCandidates = candidates.length;
    for(let ii = 0; ii < lenCandidates; ++ii) {
        let i = candidates[ii];
        let popped = edges[i];
        edges.splice(i, 1);
        let _datas = handleDatas();
        let res = findCircle(0, [], _datas); // 有些去除了 環還是在 要一個個驗證
        if(!res) {
            return popped;
        } else {
            edges.splice(i, 0, popped);
        }
    }
        
    function handleDatas(_edges = edges) {
        let datas_ = [];
        let length = _edges.length;
        for(let i = 0; i < length; ++i) { // 不用 reduce 為了效率
            let obj = _edges[i];
            datas_.push({
                index: i,
                val1: obj[0],
                val2: obj[1],
                visited: false
            });
        }
        return datas_;
    }
        
    let datas_ = handleDatas();
    
    // 再找環的情況
    function findCircle(start = 0, circle = [], datas = datas_) {
        let obj1 = datas[start];
        let length = datas.length;
        for(let i = 0; i < length; ++i) {
            let obj2 = datas[i];
            if(i !== start && !obj2.visited && obj2.val1 === obj1.val2) {
                obj2.visited = true;
                circle.push(obj2);
                if(circle.length > 1 && obj2.val2 === circle[0].val1) { // 已經形成環
                    return circle;
                } else {
                    return findCircle(i, circle, datas);
                }
                break;
            }
        }
        return false;
    }
    let circle = findCircle();
    circle.sort((b, a) => a.index - b.index);
    return [circle[0].val1, circle[0].val2];
};

複製程式碼

相關文章