力扣算法:岛屿数量

原题:

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/number-of-islands

给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。

岛屿总是被水包围,并且每座岛屿只能由水平方向或竖直方向上相邻的陆地连接形成。

此外,你可以假设该网格的四条边均被水包围。

示例 1:

输入:
11110
11010
11000
00000
输出: 1
示例 2:

输入:
11000
11000
00100
00011
输出: 3
解释: 每座岛屿只能由水平和/或竖直方向上相邻的陆地连接而成。

 

解题思路:

  我采用的方式类似于广度遍历的方式。如果该位置是 ‘1’ 则入队,然后判断其上下左右是否为 ‘1’ ,1入队,0不操作。然后出队。通过循环可以找到连接的岛屿。在入队的同时将该位置重置为‘0’

       具体代码如下

 

public int numIslands(char[][] grid) {
        int num=0; 
        for(int i=0;i<grid.length;i++){
            for(int j=0;j<grid[i].length;j++){
                if(grid[i][j]=='1'){
                    num++;
                    Queue<String> queue=new LinkedList<String>();
                    queue.offer(i+";"+j);   //起始节点入队  ,根据角标设定  i;j 的格式,i为行,j为列入队
                    grid[i][j]='0';         //该位置 重定为0
                    while(!queue.isEmpty()){   //开始广度遍历
                        String t=queue.peek();   //取队头
                        queue.poll();            //出队
                        int hang=Integer.parseInt(t.split(";")[0]);  //取出行数
                        int lie=Integer.parseInt(t.split(";")[1]);   //取出列数
//判断该点的上下左右
if(hang>0&&grid[hang-1][lie]=='1') {// queue.offer((hang - 1) + ";" + lie); grid[hang-1][lie]='0'; } if(hang<grid.length-1&&grid[hang+1][lie]=='1') {// queue.offer((hang + 1) + ";" + lie); grid[hang+1][lie]='0'; } if(lie>0&&grid[hang][lie-1]=='1') {// queue.offer(hang + ";" + (lie - 1)); grid[hang][lie - 1] = '0'; } if(lie<grid[0].length-1&&grid[hang][lie+1]=='1') {// queue.offer(hang + ";" + (lie + 1)); grid[hang][lie + 1] = '0'; } } } } } return num; }

 

PS:目前该解法时间复杂度和空间复杂度相对较高。

如有错误,欢迎指正。

posted @ 2020-06-29 21:33  星际毁灭  阅读(795)  评论(0编辑  收藏  举报