LeetCode刷题——岛屿数量#200#Medium

岛屿数量题目的思路探讨与源码
    岛屿数量的题目如下图,该题属于搜索和矩阵类型的题目,主要考察对于深度优先搜索DFS和广度优先搜索BFS的使用和理解。本文的题目作者想到2种方法,分别是深度优先搜索方法DFS和广度优先搜索方法BFS,其中深度优先搜索方法使用java进行编写,而广度优先搜索方法使用Python进行编写,当然这可能不是最优的解法,还希望各位大佬给出更快的算法。
在这里插入图片描述
    本人认为该题目可以使用深度优先搜索DFS的算法,首先我们做遍历矩阵的操作,也就是两个for循环去遍历矩阵的每一个元素,只要遇到有元素的值是1的,那么就进行深度优先搜索方法,然后把岛屿数量加1,那么对于深度优先搜索的内部方法,我们是做如下处理,首先判断传入的下标参数是否大于0,传入的矩阵是否为空,以及传入的下标是否超过了矩阵的长度,如果有一个满足条件,直接返回结果为空;否则就开始遍历,把当前下标的元素值设为0(也就是说已经遍历过了,后面再次遍历会直接忽略这个元素,这样不会导致重复计数),然后开始DFS遍历,分别是当前元素的上下左右的临近元素都遍历一次,直到跳出遍历函数,并最终返回num的结果,就是岛屿的总数量。那么按照这个思路我们的Java代码如下:

#喷火龙与水箭龟
class Solution {
    public int numIslands(char[][] grid) {
        int num = 0;
        for(int jr=0;jr<grid.length;jr++) {
            for(int kr=0;kr<grid[0].length;kr++) {
                if(grid[jr][kr]=='1'){
                    searchDFS(grid,jr,kr);
                    num=num+1;
                }
            }
        }
        return num;
    }
    private void searchDFS(char[][] grid, int ib, int jb){
        if(ib<0 || jb<0 || ib>=grid.length || jb>=grid[0].length || grid[ib][jb]=='0')
        {
		    return;
		}
        grid[ib][jb]='0';
		searchDFS(grid,ib-1,jb);
        searchDFS(grid,ib,jb-1);
        searchDFS(grid,ib+1,jb);
        searchDFS(grid,ib,jb+1);
    }
}

在这里插入图片描述
    显然,我们还可以使用广度优先搜索BFS进行处理,首先我们遍历这个矩阵,只要矩阵的元素是0就跳过;否则就开始进行广度优先搜索,并且将结果加1。那么广度优先搜索的处理步骤是,首先我用一个临时的二维列表的队列去保存当前位置,然后开始遍历,只要这个队列不为空,我就扔出第一个元素,对该元素进行判断,是否没有超出矩阵下标、是否元素的值对应是1,如果都满足,将这个元素赋值为0,然后分别去把该元素的邻近的上下左右的元素下标记录下来,并且加入到临时的队列里,最终返回结果就是岛屿的数量,所以根据这个思路就可以写出代码,下面是Python代码部分:

#喷火龙与水箭龟
class Solution:
    def numIslands(self, grid: [[str]]) -> int:
        def searchBFS(grid,iv,jv):
            tmpStack=[[iv,jv]]
            while tmpStack:
                [iv,jv]=tmpStack.pop(0)
                if(0 <=iv<len(grid) and 0<=jv<len(grid[0]) and grid[iv][jv]=='1'):
                    grid[iv][jv]='0'
                    tp=[[iv+1,jv],[iv-1,jv],[iv,jv-1],[iv,jv+1]]
                    tmpStack=tmpStack+tp
        index=0
        for iz in range(len(grid)):
            for jz in range(len(grid[0])):
                if(grid[iz][jz]=='0'):
                    continue
                searchBFS(grid,iz,jz)
                index=index+1
        return index 

在这里插入图片描述
    从结果来说java版本的深度优先搜索方法和python版本的广度优先搜索方法的速度都还不错,但应该是有更多的方法可以进一步提速的,希望朋友们能够多多指教,非常感谢。

猜你喜欢

转载自blog.csdn.net/qq_26727101/article/details/118851425