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

 

posted @ 2020-03-15 14:12  ccv2  阅读(166)  评论(0编辑  收藏  举报