200. 岛屿数量 【中等题】【深搜&广搜】
给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。
输入:
[
['1','1','1','1','0'],
['1','1','0','1','0'],
['1','1','0','0','0'],
['0','0','0','0','0']
]
输出: 1
输入:
[
['1','1','0','0','0'],
['1','1','0','0','0'],
['0','0','1','0','0'],
['0','0','0','1','1']
]
输出: 3
解释: 每座岛屿只能由水平和/或竖直方向上相邻的陆地连接而成。
【核心思想】
【数据结构】
【思路】
【代码】
class Solution {
public int numIslands(char[][] grid) {
if (grid == null || grid.length == 0) {
return 0;
}
int nums = 0;
for (int i = 0; i < grid.length; i++) {
for (int j = 0; j < grid[0].length; j++) {
if (grid[i][j] == '1') {
nums++;
dfs(grid, i, j);
}
}
}
return nums;
}
void dfs(char[][] grid, int i, int j) {
if (i < 0 || j < 0 || i >= grid.length || j >= grid[0].length || grid[i][j] == '0') {
return;
}
grid[i][j] = '0';
dfs(grid, i - 1, j);
dfs(grid, i + 1, j);
dfs(grid, i, j - 1);
dfs(grid, i, j + 1);
}
}
【备注】
public List<Integer> rightSideView(TreeNode root) {
if(root==null)
return new ArrayList<>();
Queue<TreeNode> queue=new ArrayDeque<>();
List<Integer> list=new ArrayList<>();
queue.add(root);
while(!queue.isEmpty()){
list.add(queue.peek().val);
int len=queue.size();
for(int i=0;i<len;i++){
TreeNode temp=queue.poll();
if(temp.right!=null)
queue.add(temp.right);
if(temp.left!=null)
queue.add(temp.left);
}
}
return list;
}
【核心思想】
val
需要加入list
,所以可以用一个变量level
控制【思路】
level == ans.size()
,即已经遇到了这一层最右边的结点,将其val
加入list
即可【代码】
List<Integer> list = new ArrayList<>();
public List<Integer> rightSideView(TreeNode root) {
help(root, 0);
return list;
}
void help(TreeNode root, int level) {
if (root == null)
return;
if (level == list.size())
list.add(root.val);
help(root.right, level + 1);
help(root.left, level + 1);
}
关注微信公众号“算法岗从零到无穷”,更多算法知识点告诉你。