力扣刷题——994. 腐烂的橘子 (待继续学习

994. 腐烂的橘子

这题同样打算用广度优先搜索来做,感觉难点在于记录bfs的深度

开始时写成这样

class Solution {

		int[][] dirs = new int[][] { { 0, 1 }, { 0, -1 }, { 1, 0 }, { 1, -1 } };// 方向偏移量

		public int orangesRotting(int[][] grid) {

			int ans = 0;
			boolean flag[][] = new boolean[grid.length][grid[0].length];// 记录遍历过的位置不再遍历,减小时间复杂度xxx

			Queue<int[]> queue = new LinkedList<>();// 储存烂苹果的位置

			// 先找到所有烂橘子的位置
			for (int i = 0; i < grid.length; ++i) {
				for (int j = 0; j < grid[0].length; ++j) {
					if (grid[i][j] == 2) {
						queue.offer(new int[] { i, j });
						flag[i][j] = true;
					}
				}
			}

			while (!queue.isEmpty()) {
				int[] tmp = queue.poll();
				int x = tmp[0], y = tmp[1];

				// 遍历四个方向
				for (int i = 0; i < 4; ++i) {
					int nx = x + dirs[i][0], ny = y + dirs[i][1];// 偏移后的坐标

					// 检查边界
					if (nx >= 0 && ny >= 0 && nx < grid.length && ny < grid[0].length && grid[nx][ny] == 1
							&& flag[nx][ny] == false) {
						queue.offer(new int[] {nx, ny});
						flag[nx][ny] = true;
					}
				}

				// 时间增加
				ans++;
			}

			// 遍历检查是否还有新鲜橘子
			for (int i = 0; i < grid.length; ++i) {
				for (int j = 0; j < grid[0].length; ++j) {
					if (grid[i][j] == 1) {
						return -1;
					}
				}
			}

			return ans;
		}
	}

后来看网上总结,要把每一层的都一次性拿出来遍历

class Solution {

		int[][] dirs = new int[][] { { 0, 1 }, { 0, -1 }, { 1, 0 }, { -1, 0 } };// 方向偏移量

		public int orangesRotting(int[][] grid) {

			int ans = 0;
			Queue<int[]> queue = new LinkedList<>();// 储存烂苹果的位置

			// 先找到所有烂橘子的位置
			for (int i = 0; i < grid.length; ++i) {
				for (int j = 0; j < grid[0].length; ++j) {
					if (grid[i][j] == 2) {
						queue.offer(new int[] { i, j });
					}
				}
			}

			while (!queue.isEmpty()) {
				
				int size = queue.size();//当前层的橘子数量
				
				for (int i = 0; i < size; ++i) {//取出当前层的所有橘子
					int[] tmp = queue.poll();
					int x = tmp[0], y = tmp[1];

					// 遍历四个方向
					for (int j = 0; j < 4; ++j) {
						int nx = x + dirs[j][0], ny = y + dirs[j][1];// 偏移后的坐标

						// 检查边界
						if (nx >= 0 && ny >= 0 && nx < grid.length && ny < grid[0].length && grid[nx][ny] == 1) {
							grid[nx][ny] = 2;
							queue.offer(new int[] {nx, ny});
						}
					}
				}
				
				//注意一开始的第一层烂橘子不需要时间腐烂
				if (!queue.isEmpty()) {
					// 时间增加
					ans++;
				}
			}

			// 遍历检查是否还有新鲜橘子
			for (int i = 0; i < grid.length; ++i) {
				for (int j = 0; j < grid[0].length; ++j) {
					if (grid[i][j] == 1) {
						return -1;
					}
				}
			}

			return ans;
		}
	}

posted on 2023-02-19 17:55  pumpkinsBig  阅读(44)  评论(0)    收藏  举报

导航