Skip to content

Latest commit

 

History

History
162 lines (150 loc) · 5.19 KB

994. Rotting Oranges.md

File metadata and controls

162 lines (150 loc) · 5.19 KB

leetcode Daily Challenge on August 9th, 2020.


Difficulty : Medium

Related Topics : BFS


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:

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 only 0, 1, or 2.

Solution

  • mine
    • Java
      • BFS Runtime: 2 ms, faster than 97.60%, Memory Usage: 39 MB, less than 85.21% of Java online submissions
        // O(r * c)time
        // O(Max(len(list)))space
        public int orangesRotting(int[][] grid) {
            LinkedList<int[]> list = new LinkedList<>();
            int r = grid.length, c = grid[0].length;
            int freshCount = 0;
            for (int i = 0; i < r; i++) {
                for (int j = 0; j < c; j++) {
                    if (grid[i][j] == 2) list.add(new int[]{i, j});
                    if (grid[i][j] == 1) freshCount++;
                }
            }
            int res = 0;
            while (!list.isEmpty() && freshCount != 0) {
                res++;
                int size = list.size();
                while (size > 0) {
                    size--;
                    int[] t = list.removeFirst();
                    if (t[0] > 0 && grid[t[0] - 1][t[1]] == 1) {
                        freshCount--;
                        grid[t[0] - 1][t[1]] = 2;
                        list.add(new int[]{t[0] - 1, t[1]});
                    }
                    if (t[0] + 1 < r && grid[t[0] + 1][t[1]] == 1) {
                        freshCount--;
                        grid[t[0] + 1][t[1]] = 2;
                        list.add(new int[]{t[0] + 1, t[1]});
                    }
                    if (t[1] > 0 && grid[t[0]][t[1] - 1] == 1) {
                        freshCount--;
                        grid[t[0]][t[1] - 1] = 2;
                        list.add(new int[]{t[0], t[1] - 1});
                    }
                    if (t[1] + 1 < c && grid[t[0]][t[1] + 1] == 1) {
                        freshCount--;
                        grid[t[0]][t[1] + 1] = 2;
                        list.add(new int[]{t[0], t[1] + 1});
                    }
                }
            }
            return freshCount == 0 ? res : -1;
        }
        

  • the most votes
    • BFS Runtime: 3 ms, faster than 82.65%, Memory Usage: 38.8 MB, less than 94.48% of Java online submissions
      // O(r * c)time
      // O(Max(len(queue)))space
      public int orangesRotting(int[][] grid) {
          if(grid == null || grid.length == 0) return 0;
          int rows = grid.length;
          int cols = grid[0].length;
          Queue<int[]> queue = new LinkedList<>();
          int count_fresh = 0;
          //Put the position of all rotten oranges in queue
          //count the number of fresh oranges
          for(int i = 0 ; i < rows ; i++) {
              for(int j = 0 ; j < cols ; j++) {
                  if(grid[i][j] == 2) {
                      queue.offer(new int[]{i , j});
                  }
                  else if(grid[i][j] == 1) {
                      count_fresh++;
                  }
              }
          }
          //if count of fresh oranges is zero --> return 0
          if(count_fresh == 0) return 0;
          int count = 0;
          int[][] dirs = {{1,0},{-1,0},{0,1},{0,-1}};
          //bfs starting from initially rotten oranges
          while(!queue.isEmpty()) {
              ++count;
              int size = queue.size();
              for(int i = 0 ; i < size ; i++) {
                  int[] point = queue.poll();
                  for(int dir[] : dirs) {
                      int x = point[0] + dir[0];
                      int y = point[1] + dir[1];
                      //if x or y is out of bound
                      //or the orange at (x , y) is already rotten
                      //or the cell at (x , y) is empty
                          //we do nothing
                      if(x < 0 || y < 0 || x >= rows || y >= cols || grid[x][y] == 0 || grid[x][y] == 2) continue;
                      //mark the orange at (x , y) as rotten
                      grid[x][y] = 2;
                      //put the new rotten orange at (x , y) in queue
                      queue.offer(new int[]{x , y});
                      //decrease the count of fresh oranges by 1
                      count_fresh--;
                  }
              }
          }
          return count_fresh == 0 ? count-1 : -1;
      }