let orangesRotting = function(grid) { const FRESH = 1, ROTTEN = 2, VISITED = -1; let rotten = [], totalFresh = 0, totalEmpty = 0, total = 0; function getAdjacents(row, col) { let result = []; // check top if (row > 0 && grid[row -1][col] === FRESH) { grid[row -1][col] = VISITED; result.push([row - 1, col]); } // check bottom if (row < grid.length - 1 && grid[row + 1][col] === FRESH) { grid[row +1][col] = VISITED; result.push([row + 1, col]); } // check left; if (col > 0 && grid[row][col - 1] === FRESH) { grid[row][col - 1] = VISITED; result.push([row, col - 1]); } // check right if (col < grid[row].length - 1 && grid[row][col + 1] === FRESH) { grid[row][col + 1] = VISITED; result.push([row, col + 1]); } return result; } for (let i = 0; i < grid.length; i++) { for (let j = 0; j < grid[i].length; j++) { const data = grid[i][j]; if (data === ROTTEN) { rotten.push(...getAdjacents(i, j)); } else if (data === FRESH || data === VISITED) { totalFresh++; } else { totalEmpty++; } total++; } } totalFresh -= rotten.length; let minute = 0; while (rotten.length) { let len = rotten.length; while (len --> 0) { let point = rotten.pop(); let [row, col] = point; grid[row][col] = ROTTEN; rotten.unshift(...getAdjacents(row, col)); } totalFresh -= rotten.length; minute++; } if (total === totalEmpty) return 0; let hasFreshOranges = totalFresh > 0; if (hasFreshOranges) return -1; return minute; };
Categories