題意
原題連結
給一些有向線,找出那剛好多出的一根,使之成為樹。
思路
- 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];
};
複製程式碼