zoukankan      html  css  js  c++  java
  • LeetCode 994. Rotting Oranges

    原题链接在这里:https://leetcode.com/problems/rotting-oranges/

    题目:

    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. 1 <= grid.length <= 10
    2. 1 <= grid[0].length <= 10
    3. grid[i][j] is only 01, or 2.

    题解:

    Iterate grid, for rotten orange, add it to the queue, for fresh orange, count++.

    Perform BFS, when neibor is fresh, mark it as rotton and add to que, count--.

    If eventually count == 0, then all rotton. return level.

    Note: pay attention to corner case. [[0]], at the beginning, count == 0, return 0.

    Time Complexity: O(m * n). m = grid.length. n = grid[0].length.

    Space: O(m * n).

    AC Java:

     1 class Solution {
     2     public int orangesRotting(int[][] grid) {
     3         if(grid == null || grid.length == 0){
     4             return 0;
     5         }
     6         
     7         int m = grid.length;
     8         int n = grid[0].length;
     9         LinkedList<int []> que = new LinkedList<>();
    10         int cnt = 0;
    11         for(int i = 0; i < m; i++){
    12             for(int j = 0; j < n; j++){
    13                 if(grid[i][j] == 2){
    14                     que.add(new int[]{i, j});
    15                 }else if(grid[i][j] == 1){
    16                     cnt++;
    17                 }
    18             }
    19         }
    20         
    21         if(cnt == 0){
    22             return 0;
    23         }
    24         
    25         int [][] dirs = new int[][]{{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
    26         int level = -1;
    27         while(!que.isEmpty()){
    28             level++;
    29             int size = que.size();
    30             while(size-- > 0){
    31                 int [] cur = que.poll();
    32                 grid[cur[0]][cur[1]] = 2;
    33                 
    34                 for(int [] dir : dirs){
    35                     int x = cur[0] + dir[0];
    36                     int y = cur[1] + dir[1];
    37                     if(x < 0 || x >= m || y < 0 || y >= n || grid[x][y] != 1){
    38                         continue;
    39                     }
    40                     
    41                     grid[x][y] = 2;
    42                     cnt--;
    43                     que.add(new int[]{x, y});
    44                 }
    45             }
    46         }
    47         
    48         return cnt == 0 ? level : -1;
    49     }
    50 }

    类似Walls and GatesShortest Distance from All Buildings.

  • 相关阅读:
    Shared Memory in Windows NT
    Layered Memory Management in Win32
    软件项目管理的75条建议
    Load pdbs when you need it
    Stray pointer 野指针
    About the Rebase and Bind operation in the production of software
    About "Serious Error: No RTTI Data"
    Realizing 4 GB of Address Space[MSDN]
    [bbk4397] 第1集 第一章 AMS介绍
    [bbk3204] 第67集 Chapter 17Monitoring and Detecting Lock Contention(00)
  • 原文地址:https://www.cnblogs.com/Dylan-Java-NYC/p/12169911.html
Copyright © 2011-2022 走看看