994. Rotting Oranges | LeetCode | Java | Problem Solving
You are given an m x n grid where each cell can have one of three values:
0 representing an empty cell, 1 representing a fresh orange, or 2 representing a rotten orange. Every minute, any fresh orange that is 4-directionally adjacent to a rotten orange becomes rotten.
Return the minimum number of minutes that must elapse until no cell has a fresh orange. If this is impossible, return -1.
Input: grid = [[2,1,1],[1,1,0],[0,1,1]] Output: 4
Example 2: Input: grid = [[2,1,1],[0,1,1],[1,0,1]] Output: -1 Explanation: The orange in the bottom left corner (row 2, column 0) is never rotten, because rotting only happens 4-directionally.
Example 3: Input: grid = [[0,2]] Output: 0 Explanation: Since there are already no fresh oranges at minute 0, the answer is just 0.
Constraints: m == grid.length n == grid[i].length 1 <= m, n <= 10 grid[i][j] is 0, 1, or 2.
class Solution {
public int orangesRotting(int[][] grid) {
int noOfMinutes=0, noOfFreshFruits=0, row = grid.length, col = grid[0].length;
if(row==0)
return 0;
Queue<int[]> queue = new LinkedList<>();
for(int i=0; i<row; i++){
for(int j=0; j<col; j++){
if(grid[i][j]==2){
queue.offer(new int[]{i,j});
}
else if(grid[i][j]==1){
noOfFreshFruits++;
}
}
}
if(noOfFreshFruits==0)
return 0;
int[][] axis = new int[][]{{0,-1}, { -1,0}, {1,0}, {0,1}};
while(!queue.isEmpty()){
noOfMinutes++;
int size = queue.size();
for( int i=0; i<size; i++){
int[] position = queue.remove();
for( int[] arr : axis){
int x = position[0] + arr[0];
int y = position[1] + arr[1];
if( x<0 || x>=row || y<0 || y>=col || grid[x][y]!=1){
continue;
}
queue.offer(new int[] {x,y});
grid[x][y]=2;
noOfFreshFruits--;
}
}
}
if(noOfFreshFruits>0)
return -1;
return noOfMinutes-1; }
}