数据结构之图

概念

图是网络结构的抽象模型,是一组由边连接的节点

图可以表示任何二元关系,比如道路,航班

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)   
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值