题意
原题链接
给一些有向线,找出那刚好多出的一根,使之成为树。
思路
- 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];
};