【LeetCode】 994. Rotting Oranges 腐烂的橘子(Easy)(JAVA)
题目地址: https://leetcode.com/problems/rotting-oranges/
题目描述:
In a given grid, each cell can have one of three values:
1. the value 0 representing an empty cell;
2. the value 1 representing a fresh orange;
3. 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.
题目大意
在给定的网格中,每个单元格可以有以下三个值之一:
1. 值 0 代表空单元格;
2. 值 1 代表新鲜橘子;
3. 值 2 代表腐烂的橘子。
每分钟,任何与腐烂的橘子(在 4 个正方向上)相邻的新鲜橘子都会腐烂。
返回直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1。
解题方法
一分钟遍历一次,把从新鲜变腐烂的用数字 5 表示,遍历结束后再遍历一遍把数字 5 变为 2,同时计算新鲜的数量。
直到新鲜 1 的数量为 0 或者新鲜的数量和上次一样为止。
class Solution {
public int orangesRotting(int[][] grid) {
if (grid.length == 0 || grid[0].length == 0) return 0;
int res = 0;
for (int i = 0; i < grid.length; i++) {
for (int j = 0; j < grid[0].length; j++) {
if (grid[i][j] == 1) res++;
}
}
if (res <= 0) return 0;
res = 0;
int pre = 0;
int cur = 0;
while ((cur = oH(grid)) > 0 && pre != cur) {
pre = cur;
res++;
}
return cur > 0 ? -1 : res + 1;
}
public int oH(int[][] grid) {
for (int i = 0; i < grid.length; i++) {
for (int j = 0; j < grid[0].length; j++) {
if (grid[i][j] != 2) continue;
set(grid, i - 1, j);
set(grid, i + 1, j);
set(grid, i, j - 1);
set(grid, i, j + 1);
}
}
int res = 0;
for (int i = 0; i < grid.length; i++) {
for (int j = 0; j < grid[0].length; j++) {
if (grid[i][j] == 1) res++;
if (grid[i][j] == 5) grid[i][j] = 2;
}
}
return res;
}
public void set(int[][] grid, int i, int j) {
if (i < 0 || i >= grid.length || j < 0 || j >= grid[0].length) return;
if (grid[i][j] == 1) grid[i][j] = 5;
}
}
执行用时 : 1 ms, 在所有 Java 提交中击败了 100.00% 的用户
内存消耗 : 38.2 MB, 在所有 Java 提交中击败了 60.00% 的用户