队列BFS和DFS方式岛屿数量求解 --转载

队列BFS和DFS方式岛屿数量求解

最近在做力扣学习学习数据结构与算法,评论区看到解决方案在此记录下。
在这里插入图片描述在这里插入图片描述

BFS

import java.util.LinkedList;
import java.util.Queue;

/**
 * Created by leo on 2022/1/17.
 * m == grid.length
 * n == grid[i].length
 * 1 <= m, n <= 300
 * grid[i][j] 的值为 '0' 或 '1'
 */
public class BFSTest {

	public int numIsLands(char[][] grid){
		//边界值判断
		if(grid == null || grid.length == 0){
			return 0;
		}
		//统计岛屿的个数
		int count =0;
		for(int i=0;i< grid.length;i++){
			for(int j=0;j<grid[0].length;j++){
				//只有当前格子是1,岛屿的数量+1
				if(grid[i][j] == '1'){
					//如果当前格子是1,岛屿的数量加1
					count++;
					//然后通过bfs把当前格子的上下左右4个位置为1的都要置为0,
					// 因为他们是连着一起的算一个岛屿
					bfs(grid,i,j);
				}
			}
		}
		return count;
	}
	private void bfs(char[][] grid,int x,int y){
		//把当前格子置为0
		grid[x][y] = '0';
		int n =grid.length;
		int m = grid[0].length;
		//使用队列存储的是格子坐标转化的值
		Queue<Integer> queue = new LinkedList<>();//动态数组
		//我们知道平面坐标是两位数字,但队列中存储的是一位数字,
		//所以这里是把两位数字转化为一位数字
		int code = x*m +y;
		queue.add(code);    //坐标转化的值存放到队列中
		while(!queue.isEmpty()){
			//出队并返回head
			code = queue.poll();
			//在反转成坐标值(i,j)
			int i = code / m;
			int j = code % m;
			if(i>0 && grid[i-1][j] =='1'){//上
				//如果上边格子为1,把它置为0,然后加入到队列中
				//下面同理
				grid[i-1][j] = '0';
				queue.add((i-1)*m+j);
			}
			if (i < n - 1 && grid[i + 1][j] == '1') {//下
				grid[i + 1][j] = '0';
				queue.add((i + 1) * m + j);
			}
			if (j > 0 && grid[i][j - 1] == '1') { //左
				grid[i][j - 1] = '0';
				queue.add(i * m + j - 1);
			}
			if (j < m - 1 && grid[i][j + 1] == '1') {//右
				grid[i][j + 1] = '0';
				queue.add(i * m + j + 1);
			}
		}
	}
}

DFS

/**
 * Created by leo on 2022/1/17.
 * m == grid.length
 * n == grid[i].length
 * 1 <= m, n <= 300
 * grid[i][j] 的值为 '0' 或 '1'
 */
public class DFSTest {
	//边界条件判断
	public int numIsLands(char[][] grid){
		//边界值判断
		if(grid == null || grid.length == 0){
			return 0;
		}
		int count =0;//统计岛屿数量
		//遍历格子
		for(int i =0; i<grid.length;i++){
			for(int j=0;j<grid[0].length;j++){
				//只有当前格子为1 才开始计算
				if(grid[i][j] == '1'){
					//如果当前格子为1,岛屿数量+1
					count++;
					//dfs当前格子的上下左右
					//4个位置为1 的都要置为0,它们连在一起算一个岛屿
					dfs(grid,i,j);
				}
			}
		}
		return count;
	}
	//这个方法会把当前格子以及他邻近的为1的格子都会置为0
	public void dfs(char[][] grid,int i,int j){
		//边界条件判断。不能越界
		if(i<0 || i>=grid.length||j<0|| j>= grid[0].length|| grid[i][j] == '0'){
			return;
		}
		//把当前格子置为0,然后再从他的上下左右4个方向继续遍历
		grid[i][j] = '0';
		dfs(grid, i - 1, j);//上
		dfs(grid, i + 1, j);//下
		dfs(grid, i, j + 1);//左
		dfs(grid, i, j - 1);//右
	}
}

作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/queue-stack/kbcqv/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值