Leetcode 200. Number of Islands

BFS求解岛屿数量
本文介绍了一种使用广度优先搜索(BFS)算法解决二维矩阵中岛屿数量问题的方法。通过遍历矩阵,对每个未访问过的陆地进行BFS搜索,标记连接的陆地并计数,最终得到岛屿总数。

题目: 该题有在google面试中出现

Given a 2d grid map of '1's (land) and '0's (water), count the number of islands. An island is surrounded by water and is formed by connecting adjacent lands horizontally or vertically. You may assume all four edges of the grid are all surrounded by water.

Example 1:

Input:
11110
11010
11000
00000

Output: 1

Example 2:

Input:
11000
11000
00100
00011

Output: 3

题意:

给定一个二维字符数组,它代表一片海域,其中1表示地面,0表示海水,我们需要找到这一片海域有多少个岛屿,岛屿的定义是这样的: 一块岛屿的四周都是水,也就是上下左右(不包括斜对角),假设情况下边界都是水。

 

解法:

这道题我采用BFS来进行求解。

首先我们建立一个记录访问的数组 visited[][] 它与海域数组同等大小,它记录哪一块地面我们访问过(初始为0 ,访问过后设置为1)

之后我们开始遍历海域的数组,每遇到一个地面,就依据这个地面,上下左右的进行BFS查找是否有邻接的地面,不断进行广度优先搜索,直到无法继续找到新地面,这样就完成了一个岛屿的查找,访问过的地面都记1。 之后我们继续遍历,寻找访问点为0 的地面,再进行BFS

 

代码:

class Solution {
    public int numIslands(char[][] grid) {
        int res=0;
        int width=grid.length;
        if(width==0) return  0;
        int length=grid[0].length;
        int [][]visited=new int[width][length];
        for(int i=0;i<width;i++){
            for(int j=0;j<length;j++){
                if(visited[i][j]==0&&grid[i][j]=='1'){
                    res++;
                    BFS(visited,grid,i,j,width,length);
                }
            }
        }
        return res;
    }
    public void BFS(int [][]visited,char[][] grid,int x,int y,int width,int length){
         Queue<Integer> queueX = new LinkedList<Integer>();
         Queue<Integer> queueY = new LinkedList<Integer>();
         queueX.offer(x);
         queueY.offer(y);
         while(queueX.size()!=0){
             int a=queueX.poll();
             int b=queueY.poll();
             if(a+1<width){
                 if(grid[a+1][b]=='1'&&visited[a+1][b]==0){
                     queueX.offer(a+1);
                     queueY.offer(b);
                     visited[a+1][b]=1;
                 }
             }
             if(a-1>=0){
                 if(grid[a-1][b]=='1'&&visited[a-1][b]==0){
                     queueX.offer(a-1);
                     queueY.offer(b);
                     visited[a-1][b]=1;
                 }
             }
             if(b-1>=0){
                 if(grid[a][b-1]=='1'&&visited[a][b-1]==0){
                     queueX.offer(a);
                     queueY.offer(b-1);
                     visited[a][b-1]=1;
                 }
             }
             if(b+1<length){
                 if(grid[a][b+1]=='1'&&visited[a][b+1]==0){
                     queueX.offer(a);
                     queueY.offer(b+1);
                     visited[a][b+1]=1;
                 }
             }
         }
        return;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值