Leetcode - 994. 腐烂的橘子【广度优先搜索】

456 阅读1分钟

每日一题:腐烂的橘子

在给定的网格中,每个单元格可以有以下三个值之一:

值 0 代表空单元格; 值 1 代表新鲜橘子; 值 2 代表腐烂的橘子。 每分钟,任何与腐烂的橘子(在 4 个正方向上)相邻的新鲜橘子都会腐烂。

返回直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1。 image.png 来源:力扣(LeetCode)
链接:leetcode-cn.com/problems/ro…
著作权归领扣网络所有。

解图思路

看到这种一圈圈向外扩散的题目,马上联想到广度优先搜索算法!

image.png

那什么是广式优先算法呢

像下图一样,按层搜索就是广式优先算法;
由一个点或者多个点出发,向外扩散搜索;

image.png

广式优先算法基本套路是啥

请大家伙记住下面这个公式!看见广式优先搜索 直接往上套

for 遍历所有起点
    queue.add(起点);
while (!queue.isEmpty()){
    int[] start = queue.poll(); // 拿出起点
    for 再遍历所有start的子节点
        if 判断节点是否有效且没有被访问
            queue.add(子节点);
}

腐烂的橘子题解

public int orangesRotting(int[][] grid) {
    int[][] dir = new int[][]{{1,0},{-1,0},{0,-1},{0,1}};
    int x = grid.length,y = grid[0].length;
    Queue<int[]> queue = new LinkedList<>();
    int gridNum = 0;
    for (int i = 0; i < x; i++) {
        for (int j = 0; j < y; j++) {
            // 把最开始所有腐烂的橘子,add到队列中
            if(grid[i][j] == 2){
                queue.add(new int[]{i, j,0});
            }
            // 记录所有没有腐烂的橘子
            if(grid[i][j] == 1){
                gridNum++;
            }
        }
    }
    int num = 0;
    while (!queue.isEmpty()){
        int[] xy = queue.poll();
        int mx = xy[0],my = xy[1],time = xy[2];
        // 取出队列中的一个橘子,遍历它的4边
        for (int i = 0; i < 4; i++) {
            int x_ = mx + dir[i][0],y_ = my+dir[i][1];
            // 设置边界条件
            if(x_>=0 && y_>=0 && x_< x && y_<y && grid[x_][y_]!=2){
                // 判断橘子是否腐烂,如果没有,假设它腐烂,防止二次计算
                if(grid[mx][my] == 1){
                    queue.add(new int[]{mx, my,time+1});
                    grid[mx][my] = 2;
                    gridNum --;
                }
            }
        }
        num = time;
    }
    if(gridNum != 0){
        num = -1;
    }
    return num;
}

唯有套路得人心,这波套路你学废了吗?

点赞.jpg