Overview
In an m × n grid, each cell can be: 0 (empty), 1 (fresh orange), or 2 (rotten orange). Every minute, fresh oranges adjacent (4-directionally) to rotten ones become rotten. Return the minimum minutes until no fresh orange remains, or -1 if impossible.
Constraints
1 <= m, n <= 10grid[i][j]is 0, 1, or 2.
Examples
orangesRotting([[2,1,1],[1,1,0],[0,1,1]]); // => 4 orangesRotting([[2,1,1],[0,1,1],[1,0,1]]); // => -1 (bottom-left fresh orange is unreachable)
Solution
Reveal solution
function orangesRotting(grid) {
const m = grid.length, n = grid[0].length;
const queue = [];
let fresh = 0;
for (let i = 0; i < m; i++)
for (let j = 0; j < n; j++) {
if (grid[i][j] === 2) queue.push([i, j]);
else if (grid[i][j] === 1) fresh++;
}
if (fresh === 0) return 0;
const dirs = [[1,0],[-1,0],[0,1],[0,-1]];
let minutes = 0, idx = 0;
while (idx < queue.length) {
const size = queue.length - idx;
let rotted = false;
for (let s = 0; s < size; s++) {
const [r, c] = queue[idx++];
for (const [dr, dc] of dirs) {
const nr = r+dr, nc = c+dc;
if (nr >= 0 && nr < m && nc >= 0 && nc < n && grid[nr][nc] === 1) {
grid[nr][nc] = 2;
fresh--;
queue.push([nr, nc]);
rotted = true;
}
}
}
if (rotted) minutes++;
}
return fresh === 0 ? minutes : -1;
}Resources
rotting-oranges.js
Rotting Oranges
mediumcodingAlgorithmsBFS
Overview
In an m × n grid, each cell can be: 0 (empty), 1 (fresh orange), or 2 (rotten orange). Every minute, fresh oranges adjacent (4-directionally) to rotten ones become rotten. Return the minimum minutes until no fresh orange remains, or -1 if impossible.
Constraints
1 <= m, n <= 10grid[i][j]is 0, 1, or 2.
Examples
orangesRotting([[2,1,1],[1,1,0],[0,1,1]]); // => 4 orangesRotting([[2,1,1],[0,1,1],[1,0,1]]); // => -1 (bottom-left fresh orange is unreachable)
Solution
Reveal solution
function orangesRotting(grid) {
const m = grid.length, n = grid[0].length;
const queue = [];
let fresh = 0;
for (let i = 0; i < m; i++)
for (let j = 0; j < n; j++) {
if (grid[i][j] === 2) queue.push([i, j]);
else if (grid[i][j] === 1) fresh++;
}
if (fresh === 0) return 0;
const dirs = [[1,0],[-1,0],[0,1],[0,-1]];
let minutes = 0, idx = 0;
while (idx < queue.length) {
const size = queue.length - idx;
let rotted = false;
for (let s = 0; s < size; s++) {
const [r, c] = queue[idx++];
for (const [dr, dc] of dirs) {
const nr = r+dr, nc = c+dc;
if (nr >= 0 && nr < m && nc >= 0 && nc < n && grid[nr][nc] === 1) {
grid[nr][nc] = 2;
fresh--;
queue.push([nr, nc]);
rotted = true;
}
}
}
if (rotted) minutes++;
}
return fresh === 0 ? minutes : -1;
}Resources
NameTopicDifficulty
103 of 103 problems