994. Rotting Oranges

Difficulty:
Related Topics:
Similar Questions:

Problem

You are given an m x n grid where each cell can have one of three values:

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.

  Example 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:

Solution (Java)

class Solution {
    public int orangesRotting(int[][] grid) {
        Queue<int[]> queue = new LinkedList<>();
        int row = grid.length;
        int col = grid[0].length;
        int countActive = 0;
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < col; j++) {
                if (grid[i][j] == 2) {
                    queue.add(new int[] {i, j});
                }
                if (grid[i][j] != 0) {
                    countActive++;
                }
            }
        }
        if (countActive == 0) {
            return 0;
        }
        int countCurrent = 0;
        int count = 0;
        int[] dx = {0, 0, 1, -1};
        int[] dy = {1, -1, 0, 0};
        while (!queue.isEmpty()) {
            int size = queue.size();
            count += size;
            for (int i = 0; i < size; i++) {
                int[] arr = queue.poll();
                for (int j = 0; j < 4; j++) {
                    int x = arr[0] + dx[j];
                    int y = arr[1] + dy[j];
                    if (x < 0 || y < 0 || x >= row || y >= col || grid[x][y] != 1) {
                        continue;
                    }
                    grid[x][y] = 2;
                    queue.add(new int[] {x, y});
                }
            }
            if (!queue.isEmpty()) {
                countCurrent++;
            }
        }
        return countActive == count ? countCurrent : -1;
    }
}

Solution (Javascript)

/**
 * @param {number[][]} grid
 * @return {number}
 */
var orangesRotting = function(grid) {

  if (emptyOrchard(grid)) {
    return 0;
  } 

  var stopwatch = 0;

  var cycleOranges = (grid) => {

    var checked = [];

    for (var i = 0; i < grid.length; i++) {
      for (var j = 0; j < grid[i].length; j++) {
        if (grid[i][j] === 2 && !isDuplicate(checked, [i, j])) {
          var adjacent = adjacencies(grid, i, j);
          if (adjacent) {
            adjacent.forEach(freshOrange => {
              grid[freshOrange[0]][freshOrange[1]] = 2;
              checked.push([freshOrange[0], freshOrange[1]]);
            });
          }  
        }
      }
    }
  stopwatch++;
  return adjacenciesRemain(grid) ? cycleOranges(grid) : null;
  }
  cycleOranges(grid);
  return stopwatch > 0 && emptyOrchard(grid) ? stopwatch : -1; 
};


// checks the grid for any spoiled oranges with fresh adjacencies

var adjacenciesRemain = (grid) => {
  for (var i = 0; i < grid.length; i++) {
    for (var j = 0; j < grid[i].length; j++) {
      if (grid[i][j] === 2 && adjacencies(grid, i, j)) {
        return true;
      }
    }
  }
  return false;
}


// checks coordinates for all available adjacencies

var adjacencies = (tree, i, j) => {
  var adjacent = [];

  var right = tree[i][j + 1];
  var left = tree[i][j - 1];
  var up = tree[i - 1] === undefined ? undefined : tree[i - 1][j]; 
  var down = tree[i + 1] === undefined ? undefined : tree[i + 1][j];

  right === 1 ? adjacent.push([i, j + 1]) : null;
  up === 1 ? adjacent.push([i - 1, j]) : null;
  left === 1 ? adjacent.push([i, j - 1]) : null;
  down === 1 ? adjacent.push([i + 1, j]) : null;

  return adjacent.length > 0 ? adjacent : false;

}


// checks for authenticity of incoming array

var isDuplicate = (arr1, arr2) => {
  for (var i = 0; i < arr1.length; i++) {
    if (JSON.stringify(arr1[i]) === JSON.stringify(arr2)) {
      return true;
    }
  }
  return false;
}


// checks grid for the condition of having all rotten oranges or no oranges at all

var emptyOrchard = (grid) => {

  var rotten = false;
  var fresh = false;
  var absent = false;

  for (var i = 0; i < grid.length; i++) {
    for (var j = 0; j < grid[i].length; j++) {
      if (grid[i][j] === 2) {
        rotten = true;
      } else if (grid[i][j] === 1) {
        fresh = true;
      } else if (grid[i][j] === 0) {
        absent = true;
      }
    }
  }
  return (rotten && !fresh) || (absent && !rotten & !fresh);
}

Explain:

nope.

Complexity: