【LeetCode-中等题】994. 腐烂的橘子

题目

在这里插入图片描述

该题值推荐用bfs,因为是一层一层的感染,而不是一条线走到底的那种,所以深度优先搜索不适合

方法一:bfs+层序遍历

广度优先搜索,就是从起点出发,每次都尝试访问同一层的节点,如果同一层都访问完了,再访问下一层,最后广度优先搜索找到的路径就是从起点开始的最短合法路径。

在该题:假设图中只有一个腐烂的橘子,它每分钟向外拓展,腐烂上下左右相邻的新鲜橘子,那么下一分钟,就是这些被腐烂的橘子再向外拓展腐烂相邻的新鲜橘子,这与广度优先搜索的过程均一一对应,上下左右相邻的新鲜橘子就是该腐烂橘子尝试访问的同一层的节点,路径长度就是新鲜橘子被腐烂的时间。
在这里插入图片描述

class Solution {
// 方法一 : bfs   
    int m = 0;
    int n = 0;//  全局 格子宽度和长度
    int minute = 0;//全局  最小分钟数
    int fulash = 0;// 记录1的个数
    public int orangesRotting(int[][] grid) {
       m = grid.length;
       n = grid[0].length;
       Queue<int[]> queue = new LinkedList<>();
       for(int i = 0; i<m ; i++)
       for(int j = 0; j<n ; j++){
           if(grid[i][j] == 1 ) fulash++;//记录新鲜橘子的个数
           if(grid[i][j] == 2 ){
               grid[i][j] = 2;
               queue.offer(new int[]{i,j});//将坏橘子坐标数组 存入队列
               
           }
       }
        //层序遍历
          while(!queue.isEmpty() && fulash > 0){// 当队列空了 或者 没有新鲜橘子了,停止循环
                    int size = queue.size();
                    minute++;// 一层一层的传染,每传染一层,时间+1
                for(int i = 0 ; i<size ;i++){
                   int[] mid = queue.poll();
                   int x = mid[0];
                   int y = mid[1];
                   //上
                   if(x+1 < m && grid[x+1][y]== 1 ){
                       fulash--; // 每传染一个,更新新鲜橘子的数量
                      grid[x+1][y] = 2;//将新鲜果子感染
                      queue.offer(new int[]{x+1,y});//将感染的果子加入队列,进行下一层的处理

                   }
                   //下
                   if(x-1 >=0 && grid[x-1][y]== 1 ){
                         fulash--;
                       grid[x-1][y] = 2;
                       queue.offer(new int[]{x-1,y});
                        
                   }
                   //右
                   if(y+1 < n && grid[x][y+1]== 1 ){
                         fulash--;
                       grid[x][y+1] = 2;
                       queue.offer(new int[]{x,y+1});
                        
                   }
                   //左
                   if(y-1 >=0 && grid[x][y-1]== 1 ){
                         fulash--;
                       grid[x][y-1] = 2;
                       queue.offer(new int[]{x,y-1});  
                   }
            }

                
        }

        if(fulash > 0) return -1;//若还有新鲜橘子  则返回-1
        else  return minute;//无新鲜橘子  则返回minute
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值