概念
图是网络结构的抽象模型,是一组由边连接的节点
图可以表示任何二元关系,比如道路,航班
JS当中没有图,但是可以用Object和Array构建图
图的表示法:邻接矩阵,邻接表,关联矩阵
图的深度优先遍历
const graph={
0:[1,2],
1:[2],
2:[0,3],
3:[3]
}
const mySet=new Set();
const dfs(n)=>{
console.log(n);
mySet.add(n);
graph[n].forEach(c=>{
if(!mySet.has(c)){
dfs(c);
}
});
}
dfs(0);
图的广度优先遍历
const graph={
0:[1,2],
1:[2],
2:[0,3],
3:[3]
}
const visited=new Set();
visited.add(2);
const q=[2];
while(q.length){
const n=q.shift();
console.log(n);
graph[n].forEach(i=>{
if(!visited.has(i)){
q.push(c);
visited.add(i);
}
});
}
dfs(0);
有效数字
var isNumber = function(s) {
let graph={
0:{"blank":0,"sign":1,".":2,"digit":6},
1:{"digit":6,".":2},
2:{"digit":3},
3:{"digit":3,"e":4},
4:{"digit":5,"sign":7},
5:{"digit":5},
6:{"digit":6,".":3,"e":4},
7:{"digit":5}
}
let state=0;
for(c of s.trim()){
if(c>='0'&&c<='9'){c="digit";}
if(c==='E'){c='e'}
if(c===' '){c="blank";}
if(c==='+'||c==='-'){
c="sign";
}
state=graph[state][c];
if(state===undefined){return false}
}
if(state===3||state===5||state===6){
return true }
return false
};
太平洋大西洋水流问题
var pacificAtlantic = function(heights) {
if(!heights||!heights[0]) {return []}
let m=heights.length;
let n=heights[0].length;
let res=[];
let flow1=Array.from({length:m},()=>new Array(n).fill(false));
let flow2=Array.from({length:m},()=>new Array(n).fill(false));
const dfs=(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<n &&!flow[nr][nc]&&heights[nr][nc]>=heights[r][c]
){
dfs(nr,nc,flow);
}
});
}
for(let r=0;r<m;r++){
dfs(r,0,flow1);
dfs(r,n-1,flow2);
}
for(let c=0;c<n;c++){
dfs(0,c,flow1);
dfs(m-1,c,flow2)
}
for(let r=0;r<m;r++){
for(let c=0;c<n;c++){
if(flow1[r][c]&&flow2[r][c]){
res.push([r,c]);
}
}
}
return res
};
克隆图
var cloneGraph = function(node) {
if(!node){return}
let visited=new Map();
const dfs=(n)=>{
let 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)
};