LeetCode 994.腐烂的橘子(打卡第四天)

题目

  1. 腐烂的橘子
    在给定的网格中,每个单元格可以有以下三个值之一:

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

返回直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1。

avatar

示例 1:
输入:[[2,1,1],[1,1,0],[0,1,1]]
输出:4
示例 2:

输入:[[2,1,1],[0,1,1],[1,0,1]]
输出:-1
解释:左下角的橘子(第 2 行, 第 0 列)永远不会腐烂,因为腐烂只会发生在 4 个正向上。
示例 3:

输入:[[0,2]]
输出:0
解释:因为 0 分钟时已经没有新鲜橘子了,所以答案就是 0 。

提示:

1 <= grid.length <= 10
1 <= grid[0].length <= 10
grid[i][j] 仅为 0、1 或 2

解题思路

/* 
	 * 思路:
	 * 先遍历数组找出腐烂橘子并入队其位置
	 * 然后出队每一个腐烂橘子
	 * “感染”四周的橘子,
	 * 如果位置越界就不操作,并将感染后的橘子进队
	 * 直到队空
	 * 最后遍历并返回结果
	 */

代码

class Solution {
    Queue<index> queue=new LinkedList<>();
	class index{
		int x;
		int y;
		int minute;
		index(int a,int b,int c){
			x=a;
			y=b;
			minute=c;
		}
	}
	public int orangesRotting(int[][] grid) {
		//bfs
		
		int minutes=0;
		int Px=grid.length;//行
		int Py=grid[0].length;//列
		for(int i=0;i<Px;i++) {
			for(int j=0;j<Py;j++)
			{
				if(grid[i][j]==2)
					queue.add(new index(i,j,minutes));
			}
		}//找到已被“感染”的橘子
		while(!queue.isEmpty()) {
			//出队
			index cur=queue.remove();
			minutes=cur.minute;
			//找到界限并判断四周感染情况
			beat(grid,cur.x,cur.y,cur.minute);
			}
		//遍历判断是否感染完全
		for(int i=0;i<Px;i++) {
			for(int j=0;j<Py;j++)
			{
				if(grid[i][j]==1)
					return -1;
			}
		}//找到已被“感染”的橘子
		return minutes;
    }

	private void beat(int[][] grid, int x, int y, int minute) {
		//"感染"
		Judge(grid,x-1,y,minute);
		Judge(grid,x,y-1,minute);
		Judge(grid,x,y+1,minute);
		Judge(grid,x+1,y,minute);
	}

	private void Judge(int[][] grid, int x, int y, int minute) {
		//感染操作
		if((x>=0&&x<grid.length)&&(y>=0&&y<grid[0].length)){if(grid[x][y]==1) {
			queue.add(new index(x,y,minute+1));
			grid[x][y]=2;
		}}
		
	}

	public void main(String[] args) {
		//
		int[][] grid= {{2,1,1},{1,1,0},{0,1,1}};
		orangesRotting(grid);
	}
}

第四天 √

发布了11 篇原创文章 · 获赞 6 · 访问量 1608

猜你喜欢

转载自blog.csdn.net/qq_41119146/article/details/104651928