994. Rotting-Oranges
difficulty: Medium
section pre{ background-color: #eee; border: 1px solid #ddd; padding:10px; border-radius: 5px; }
In a given grid, each cell can have one of three values:
the value
0
representing an empty cell;the value
1
representing a fresh orange;the value
2
representing a rotten orange.
Every minute, any fresh orange that is adjacent (4-directionally) 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
instead.
Example 1:
Input: [[2,1,1],[1,1,0],[0,1,1]]
Output:
4
Example 2:
Input: [[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: [[0,2]]
Output:
0
Explanation:
Since there are already no fresh oranges at minute 0, the answer is just 0.
Note:
1 <= grid.length <= 10
1 <= grid[0].length <= 10
grid[i][j]
is only0
,1
, or2
.
Method One
class Solution {
public int orangesRotting(int[][] grid) {
int rows = grid.length;
if( rows < 1 ) return 0;
int columns = grid[0].length;
Queue<int[]> bfsQueue = new LinkedList<>();
int oranges = 0;
for( int i = 0; i < rows; i++ ) {
for( int j = 0; j < columns; j++ ) {
if( grid[i][j] == 1 || grid[i][j] == 2) {
oranges += 1;
}
if( grid[i][j] != 2 ) {
continue;
}
bfsQueue.offer( new int[]{i,j} );
}
}
if( bfsQueue.size() == 0 ) {
return oranges == 0 ? 0 : -1;
}
int time = -1;
while( !bfsQueue.isEmpty() ) {
int size = bfsQueue.size();
while( size > 0 ) {
size -= 1;
oranges -= 1;
int[] cur = bfsQueue.poll();
int row = cur[0];
int col = cur[1];
if( row > 0 && grid[ row - 1 ][ col ] == 1 ) {
bfsQueue.offer( new int[]{ row - 1, col } );
grid[ row - 1 ][ col ] = 2;
}
if( row < rows - 1 && grid[ row + 1 ][ col ] == 1 ) {
bfsQueue.offer( new int[]{ row + 1, col });
grid[ row + 1 ][ col ] = 2;
}
if( col > 0 && grid[ row ][ col - 1 ] == 1 ) {
bfsQueue.offer( new int[]{ row, col - 1} );
grid[ row ][ col - 1 ] = 2;
}
if( col < columns - 1 && grid[ row ][ col + 1 ] == 1 ) {
bfsQueue.offer( new int[]{ row, col + 1 });
grid[ row ][ col + 1 ] = 2;
}
}
time += 1;
}
return oranges == 0 ? time : -1;
}
}
Same idea, better code;
class Solution {
private int[] directions = {1, 0, -1, 0, 1};
public int orangesRotting(int[][] grid) {
//bfs
int M = grid.length;
int N = grid[0].length;
int totalFresh = 0;
ArrayDeque<int[]> queue = new ArrayDeque<>();
for(int i = 0; i < M; i++){
for(int j = 0; j < N; j++){
if(grid[i][j] == 1) totalFresh++;
if(grid[i][j] == 0) continue;
if(grid[i][j] == 2) queue.offer(new int[]{i, j});
}
}
if(totalFresh == 0) return 0;
int steps = -1;
while(!queue.isEmpty()){
int size = queue.size();
while(size > 0){
int[] cur = queue.poll();
for(int i = 0; i < directions.length - 1; i++){
int nextRow = cur[0] + directions[i];
int nextCol = cur[1] + directions[i + 1];
if(nextRow < 0 || nextCol < 0 || nextRow >= M || nextCol >= N) continue;
if(grid[nextRow][nextCol] == 1) {
grid[nextRow][nextCol] = 2;
totalFresh--;
queue.offer(new int[]{nextRow, nextCol});
}
}
size--;
}
steps++;
}
return totalFresh == 0 ? steps : -1;
}
}
Last updated
Was this helpful?