994. 腐烂的橘子

题目:

思路:

【1】广度搜索处理感染问题

代码展示:

//时间1 ms 击败 100%
//内存39.9 MB 击败 91.75%
class Solution {
    /**
     * 坏橘子感染好橘子,就是扩散的方式,这种用广度搜索的方式是最好处理的
     * @param grid
     * @return
     */
    public int orangesRotting(int[][] grid) {
        int row = grid.length, col = grid[0].length;
        //坏橘子的坐标数组集合(x,y)
        Queue<int[]> que = new LinkedList<int[]>();
        // 好橘子的个数
        int count = 0;
        for (int i = 0; i < row; i++){
            for (int j = 0; j < col; j++){
                if (grid[i][j] == 2){
                    que.add(new int[]{i,j});
                }else if (grid[i][j] == 1){
                    count++;
                }
            }
        }
        // 没有好的橘子,就不需要感染
        if (count == 0) return 0;
        // 四个方向,向上,向左,向下,向右
        int step = 0;
        int[][] pathList = new int[][]{{-1,0},{0,-1},{1,0},{0,1}};
        while (!que.isEmpty() ){
            int size = que.size();
            int cur_count = count;
            while (size-- > 0){
                int[] tem = que.poll();
                for (int[] p : pathList){
                    int newRow = tem[0] + p[0];
                    int newCol = tem[1] + p[1];
                    // 坐标在限制内,且是好橘子,那么这一圈就会被感染成坏的
                    if (newRow >= 0 && newCol >= 0 && newRow < row && newCol < col && grid[newRow][newCol] == 1){
                        //感染成坏的
                        grid[newRow][newCol] = 2;
                        //塞入队列,等待下一次感染
                        que.add(new int[]{newRow,newCol});
                        //好的橘子减少
                        count--;
                    }
                }
            }
            if (cur_count != count) step++;
        }

        return count > 0 ? -1 : step;
    }
}

 

posted @ 2023-08-01 18:44  忧愁的chafry  阅读(4)  评论(0编辑  收藏  举报