检验一数组里,是否有闭环:
[{from: 1,to: 2}, {from:2, to:3}] 返回false
[{from: 1,to: 2}, {from:2, to:3}, {from: 3, to:1}] 返回true
[{from: 1,to: 2}, {from:2, to:3}, {from: 3, to:4}, {from: 4, to:2}] 返回 true
这应该怎么个解法
检验一数组里,是否有闭环:
[{from: 1,to: 2}, {from:2, to:3}] 返回false
[{from: 1,to: 2}, {from:2, to:3}, {from: 3, to:1}] 返回true
[{from: 1,to: 2}, {from:2, to:3}, {from: 3, to:4}, {from: 4, to:2}] 返回 true
这应该怎么个解法
这个数组是连续的,还是打乱的,连续的一遍遍历就行,不连续的复杂点
//数组连续
function closed(arr){
if(arr.length <= 1)return false
for(let i = 0, l = arr.length; i < l; i++){
if(arr[i].to !== arr[i == l - 1 ? 0 : (i + 1)].from){
return false
}
}
return true
}
//数组不连续
function closed(arr){
if(arr.length <= 1)return false
let obj = arr.reduce((obj, item) => {
obj[item.from] = item
return obj
}, {})
for(let i = 0, l = arr.length, v; i < l; i++){
if(!obj[arr[i].from] || !obj[arr[i].to]){
return false
}
}
return true
}
本质就是有向图找闭环。
(不要使用 0 节点编号)
const hasRing = arr => {
const G = [ [] ], V = [ 4 ]
arr.forEach(({ from, to }) => {
if (! G[from]) G[from] = []
G[0][from] = G[0][to] = G[from][to] = true
V[from] = V[to] = 1
})
const dfs = v => {
if (v && V[v] === 3) return true
if (G[v]) for (const i in G[v]) {
console.log(`${v} -> ${i}`)
if (v) V[i] ++
if (dfs(i)) return true
}
return false
}
return dfs(0)
}
PS: 怎么每次回答完问题就发现有人抢先了
1 回答3.1k 阅读✓ 已解决
1 回答2.6k 阅读
2.5k 阅读
1 回答1.1k 阅读
1 回答421 阅读✓ 已解决
1 回答381 阅读✓ 已解决
817 阅读
我觉得该问题的本质其实是“检测有向图中是否存在闭环”。
然而题目中的这些数组却都是边,我觉得比较简单的解法就是,先根据这些边构建出一个有向图,再去解决如何检测有向图中是否存在闭环的问题。
比如