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