LeetCode中的BFS和DFS专题

LeetCode中的BFS和DFS专题

BFS广度优先,是按照层来扩展的;DFS深度优先,是“一条道走到黑”。

如果是一个规模为2的n次方的问题,那么BFS的时间复杂度是2的n次方,而DFS的时间复杂度是n。

一般用BFS来解决迷宫的最短路径问题,这是因为DFS走到终点的时候可能是绕了一大圈才到达终点。

BFS

1.空间大,是呈指数增长的

2.不会有爆栈的风险,申请的空间是堆空间

3.可以搜索最短或者最小路径

DFS

1.空间与深度成正比

2.有爆栈的风险,比如树的深度过大的情况下

3.无法搜索最短、最小的路径

111.二叉树的最小深度

LeetCode中的BFS和DFS专题_第1张图片

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    int minDepth(TreeNode* root) {
        if(!root) return 0;
        int left = minDepth(root->left);
        int right = minDepth(root->right);
        if(!left&&right) return right+1; 
        if(!right&&left)  return left+1;
        return min(left,right)+1;
    }
};

279.完全平方数

LeetCode中的BFS和DFS专题_第2张图片

class Solution {
public:
    int numSquares(int n) {
        queue<int> q;
        vector<int> dist(n+1,INT_MAX);
        q.push(0);
        dist[0] = 0;
        while(q.size()){
            int t=q.front();
            q.pop();
            if(t==n) return dist[t];
            for(int i=1;i*i+t<=n;i++){
                int j=t+i*i;
                if(dist[j]>dist[t]+1){
                    dist[j]=dist[t]+1;
                    q.push(j);
                }
            }
        }
        return 0;
    }
};

733.图像渲染

LeetCode中的BFS和DFS专题_第3张图片

class Solution {
public:
    vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int newColor) {
        if(image.empty()||image[0].empty()) return image;
        int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
        int oldColor = image[sr][sc];
        if(oldColor==newColor) return image;
        image[sr][sc] = newColor;
        for(int i=0;i<4;i++){
            int x=sr+dx[i],y=sc+dy[i];
            if(x>=0&&x<image.size()&&y>=0&&y<image[0].size()&&image[x][y]==oldColor){
                floodFill(image,x,y,newColor);
            }
        }
        return image;
    }
};

200.岛屿数量

LeetCode中的BFS和DFS专题_第4张图片

class Solution {
public:
    int m,n;
    int numIslands(vector<vector<char>>& grid) {
        if(grid.empty()||grid[0].empty())  return 0;
        n = grid.size(),m=grid[0].size();
        int res=0;
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(grid[i][j]=='1'){
                    res++;
                    dfs(grid,i,j);
                }
            }
        }
        return res;
    }
    void dfs(vector<vector<char>>& grid,int x,int y){
        int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
        grid[x][y]='0';
        for(int i=0;i<4;i++){
           int a=x+dx[i],b=y+dy[i];
           if(a>=0 && a<n && b>=0 && b<m && grid[a][b]=='1')
                dfs(grid,a,b);
        }
    }
};

你可能感兴趣的:(LeetCode)