zoukankan      html  css  js  c++  java
  • DFS 和 BFS

    一、DFS(深度优先搜索)——使用栈或者递归

    模版:

    dfs出口,不满足条件就退出
    
    操作
    
    递归,接着进一步DFS

    二、BFS(广度优先搜索)——使用队列

    模版:

    条件判断(边界判断,其他要求的判断)
    
    创建队列
    
    在队列中加入第一个满足条件的元素
    
    while(队列不为空) {
        取出队列头部元素
        操作
        根据头部元素,往队列中再次加入满足条件的元素
    }

    leetcode题目为例子进行应用:

    方法一、DFS(递归)

    /**
     * @param {number[][]} image
     * @param {number} sr
     * @param {number} sc
     * @param {number} newColor
     * @return {number[][]}
     */
    var floodFill = function(image, sr, sc, newColor) {
        direction=[[0,1],[0,-1],[1,0],[-1,0]];
        if(image[sr][sc]!= newColor){
            var oldcolor = image[sr][sc];
            image[sr][sc] = newColor;
            for(var k=0;k<4;k++){
                var newx = sr+direction[k][0];
                var newy = sc+direction[k][1];
                if(newx>=0 && newx<image.length && newy>=0 && newy<image[0].length && image[newx][newy]==oldcolor){
                    floodFill(image,newx,newy,newColor);
                }
            }
        }
        return image;
    };

    方法二、BFS(使用队列)

    /**
     * @param {number[][]} image
     * @param {number} sr
     * @param {number} sc
     * @param {number} newColor
     * @return {number[][]}
     */
    var floodFill = function(image, sr, sc, newColor) {
        if (image == null || image.length == 0 || image[0].length == 0 || image[sr][sc] == newColor) return image;
        var dir=[[0,1],[0,-1],[-1,0],[1,0]];
        var arr = [];
        var oldcolor=image[sr][sc];
        arr.push(sr * image[0].length + sc);
        while(arr.length>0){
            var str = arr.shift();
            var x=Math.floor(str/(image[0].length));
            var y=str%(image[0].length);
            image[x][y]=newColor;
            for(var k=0;k<4;k++){
                var newx=x+dir[k][0];
                var newy=y+dir[k][1];
                //这里的条件判断如果把image[newx][newy]==oldcolor放到前面就会报错,不知道为什么?
                if( newx>=0 && newx<image.length && newy>=0 && newy<(image[0].length) && image[newx][newy]==oldcolor )
                {
                    arr.push(newx * (image[0].length) + newy);
                }
            }
        }
        return image;
    };
  • 相关阅读:
    数据结构 字符串的长度
    滚动条
    git push 一直卡在 writing objects 然后 就提交失败 提示:unexpected-disconnect-while-reading-sideband-packet
    vue中的防抖和节流
    html5中output元素详解
    手写 apply call bind 三个方法
    js中的陷阱!!!
    display:inline-block元素之间空隙的产生原因和解决办法
    git push到Gitee的时候上传不成功,可能是本地文件夹与远程仓库不同步
    axios没有实现jsonp这个功能,基于axios自己扩展一个
  • 原文地址:https://www.cnblogs.com/ccv2/p/12497293.html
Copyright © 2011-2022 走看看