200. 岛屿数量
给你一个由 '1'
(陆地)和 '0'
(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。
示例 1:
输入:grid = [
["1","1","1","1","0"],
["1","1","0","1","0"],
["1","1","0","0","0"],
["0","0","0","0","0"]
]
输出:1
示例 2:
输入:grid = [
["1","1","0","0","0"],
["1","1","0","0","0"],
["0","0","1","0","0"],
["0","0","0","1","1"]
]
输出:3
提示:
m == grid.length
n == grid[i].length
1 <= m, n <= 300
grid[i][j]
的值为'0'
或'1'
class Solution {
public int numIslands(char[][] grid) {
int m = grid.length;
int n = grid[0].length;
int i, j;
int count = 0;
for (i = 0; i < m; i++) {
for (j = 0; j < n; j++) {
if (grid[i][j] == '1') {
visitIsland( i, j, grid);
count++;
}
}
}
return count;
}
private void visitIsland(int i, int j, char[][] grid) {
if ('1' != grid[i][j])
return;
int m = grid.length; // i
int n = grid[0].length; // j
grid[i][j] = '0';
if (i - 1 >= 0)
visitIsland(i - 1, j, grid);
if (i + 1 < m)
visitIsland(i + 1, j, grid);
if (j - 1 >= 0)
visitIsland(i, j - 1, grid);
if (j + 1 < n)
visitIsland(i, j + 1, grid);
}
}
994. 腐烂的橘子
在给定的 m x n
网格 grid
中,每个单元格可以有以下三个值之一:
- 值
0
代表空单元格; - 值
1
代表新鲜橘子; - 值
2
代表腐烂的橘子。
每分钟,腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。
返回 直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1
。
示例 1:
输入:grid = [[2,1,1],[1,1,0],[0,1,1]]
输出:4
示例 2:
输入:grid = [[2,1,1],[0,1,1],[1,0,1]]
输出:-1
解释:左下角的橘子(第 2 行, 第 0 列)永远不会腐烂,因为腐烂只会发生在 4 个方向上。
示例 3:
输入:grid = [[0,2]]
输出:0
解释:因为 0 分钟时已经没有新鲜橘子了,所以答案就是 0 。
提示:
m == grid.length
n == grid[i].length
1 <= m, n <= 10
grid[i][j]
仅为0
、1
或2
/*
题目思路:
1 dfs扩散
2 当前阶段的初始烂橘子没必要加入新的队列
3 烂无可烂停止,判断新鲜橘子数量
*/
class Solution {
public:
static constexpr int DIRS[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
int orangesRotting(vector<vector<int>>& grid) {
int m = grid.size();
int n = grid.front().size();
int fresh{};
queue<pair<int, int>> badFruits{};
// 预处理
for (auto i = 0; i < m; ++i) {
for (auto j = 0; j < n; ++j) {
if (grid[i][j] == 1) {
fresh++;
} else if (grid[i][j] == 2) {
badFruits.push({i, j});
}
}
}
// 烂起来啦
int minutes{};
while (fresh != 0 && !badFruits.empty()) { // fresh也不要忘啦
decltype(badFruits) next{};
minutes++;
int cnt = badFruits.size();
while (cnt--) {
auto pos = badFruits.front();
badFruits.pop();
for (auto &[dx, dy] : DIRS) {
int x = pos.first + dx;
int y = pos.second + dy;
if (x < 0 || x >= m || y < 0 || y >= n) {
continue;
}
if (grid[x][y] == 1) {
next.push({x, y});
fresh--;
grid[x][y] = 2; // 别忘啦
}
}
}
badFruits = move(next);
}
return fresh != 0 ? -1 : minutes;
}
};