题目
链接(https://leetcode-cn.com/problems/number-of-islands/)
给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。
示例 1:
输入:
11110
11010
11000
00000
输出: 1
示例 2:
输入:
11000
11000
00100
00011
输出: 3
分析
这道题目相对简单
首先遍历这个二维数组,遇到1 ,就计数加一,然后把这个坐标添加到stack里面。
取stack顶部,遍历。遍历的方法是上下左右一直遍历。
如上遍历:i--,遇到1就把1改成0,然后添加到tack中只到遇到0或者超出边界
代码
class Solution {
public int numIslands(char[][] grid) {
//岛屿计数
int account = 0;
//还未遍历的点
Stack<int[]> stack = new Stack<>();
for (int i = 0; i < grid.length; i++) {
for (int j = 0; j < grid[i].length; j++) {
if (grid[i][j]=='1'){
//遇到岛屿 计数加一
account++;
int [] temp = {i,j};
//然后入栈
stack.push(temp);
while (!stack.empty()){
//取出未遍历的点
int[] top = stack.pop();
//遍历上下左右四个方向
turnRight(grid,top[0],top[1],stack);
turnLeft(grid,top[0],top[1],stack);
turnUp(grid,top[0],top[1],stack);
turnDown(grid,top[0],top[1],stack);
}
}
}
}
return account;
}
//left遍历,一直向lefg遍历,直到遇到0或者超出边界。遇到1则把1变成0,然后把这个点放入为遍历的stack
private void turnLeft(char[][] grid, int i, int j, Stack<int[]> stack) {
while ((j+1<grid[i].length) && grid[i][j+1]=='1'){
j++;
grid[i][j]='0';
int[] temp = {i,j};
stack.push(temp);
}
}
private void turnRight(char[][] grid, int i, int j, Stack<int[]> stack) {
while ((j-1>=0) && grid[i][j-1]=='1'){
j--;
grid[i][j]='0';
int[] temp = {i,j};
stack.push(temp);
}
}
private void turnUp(char[][] grid, int i, int j, Stack<int[]> stack) {
while ((i-1>=0) && grid[i-1][j]=='1'){
i--;
grid[i][j]='0';
int[] temp = {i,j};
stack.push(temp);
}
}
private void turnDown(char[][] grid, int i, int j, Stack<int[]> stack) {
while ((i+1<grid.length) && grid[i+1][j]=='1'){
i++;
grid[i][j]='0';
int[] temp = {i,j};
stack.push(temp);
}
}
}