417. 太平洋大西洋水流问题
思路:深度优先遍历,逆流而上(比它大或者同等)的就是可以流到太平洋或者大西洋的坐标
var pacificAtlantic = function(matrix) {
if(!matrix||!matrix[0]) return []
const m = matrix.length // 行
const n = matrix[0].length // 列
const flow1 = Array.from({length:m},()=>new Array(n).fill(false))
const flow2 = Array.from({length:m},()=>new Array(n).fill(false))
// 深度优先遍历
const dfs = (r, c, flow) => { // r行 c列 flow太平洋或大西洋
flow[r][c] = true;
[[r-1, c],[r+1, c],[r, c-1],[r, c+1]].forEach(([nr, nc]) => { // 下一个节点的行、列
if(
// 保证在矩阵中
nr >=0 && nr<m &&
nc >=0 && nc<c &&
// 防止死循环,必须没有访问过
!flow[nr][nc] &&
// 保证逆流而上
matrix[nr][nc] >= matrix[r][c]
){
dfs(nr, nc, flow)
}
})
}
// 沿着海岸线逆流而上
for(let r=0; r<m ;r+=1){
dfs(r, 0, flow1) // 第1行到m行,列为0的进行dfs,第一列流到太平洋
dfs(r, n-1, flow2) // 第1行到m行,遍历最后一列的格子,对这些格子进行dfs,最后一列流到大西洋
}
for(let c=0; c<n; c+=1){
dfs(0,c,flow1) // 遍历第一行的格子进行dfs搜索
dfs(m-1,c,flow1) // 遍历最后一行的格子进行dfs搜索
}
// 收集两个大洋里的坐标
const res=[]
for(let r=0;r<m;r+=1){
for(let c=0;c<n;c+=1){
if(flow1[r][c]&&flow2[r][c]){
res.push([r,c]) // 能流到太平洋或大西洋
}
}
}
return res
};
133. 克隆图
// 深度优先搜索
var cloneGraph = function (node) {
if(!node) return
const visited = new Map()
const dfs=(n)=>{
const nCopy = new Node(n.val)
visited.set(n, nCopy); // 存储原来节点和拷贝节点的映射关系
(n.neighbors||[]).forEach(ne=>{
if(!visited.has(ne)){
dfs(ne)
}
nCopy.neighbors.push(visited.get(ne))
})
}
dfs(node)
return visited.get(node)
}
// 广度优先搜索
var cloneGraph = function (node) {
if(!node) return
const visited = new Map()
visited.set(node, new Node(node.val))
const q = [node]
while(q.length){
const n = q.shift();
(n.neighbors||[]).forEach(ne=>{
if(!visited.has(ne)){
q.push(ne)
visited.set(ne, new Node(ne.val))
}
visited.get(n).neighbors.push(visited.get(ne))
})
}
return visited.get(node)
}
``