LeetCode-深度优先遍历(DFS)

算法思想

从图中的某个顶点 K 出发,按照一定的原则(比如:总是先选择右边第一个点)先去访问它的邻接点,初始状态下 K 的邻接点未被访问过,按照这个原则找到它的一个未被访问过的邻接点,然后将该邻接点标记为 “true”,表示该点已经被访问过。直到有一个顶点 N,按照该原则下,它的邻接点已经被访问,则退回到 N 点,再去访问它右边第二个点,以此类推,直到所有的顶点都被访问到,遍历结束。

这里我们以邻接矩阵的方式来讲解 DFS 的算法执行流程:
LeetCode-深度优先遍历(DFS)_第1张图片
题目中的思路:通过 DFS 递归,先朝一个方向搜索,当路径上遇到一个节点 k+1 不满足条件时,再回溯至上个节点,沿其它方向搜索,以此类推。

代码实现(待补充)

在这里插入代码片

当图是连通图时,DFSTraverse()方法中的循环执行一次就可以;

当图是非连通图时,需要对它的连通分量分别进行DFS遍历,当图中尚有顶点还有顶点未被访问,则另选图中一个未曾被访问的顶点作为起始点,重复上述过程,直到图中所有的节点都被访问到为止。

相关题目

题目一

热题100-200. 岛屿数量

给一个01矩阵,1代表是陆地,0代表海洋, 如果两个1相邻,那么这两个1属于同一个岛。我们只考虑上下左右为相邻。

岛屿: 相邻陆地可以组成一个岛屿(相邻:上下左右) 判断岛屿个数。

解题思路

  • 通过 dfs,遍历岛屿时将对应的 1 置为 0,当一个岛屿的周围都是 0,表示该岛屿已经遍历完成,返回将结果 +1

代码及注解

import java.util.*;

public class Solution {
    public int solve (char[][] grid) {
        int r=grid.length;
        int c=grid[0].length;
        int count=0;
        // 当矩阵的(i,j)位置为 1 时,开始遍历
        for(int i=0;i<r;i++){
            for(int j=0;j<c;j++){
                if(grid[i][j]=='1'){
                    dfs(i,j,r,c,grid);
                    count++;
                }
            }
        }
        return count;
    }
    /**
     * 
     * @param i 遍历位置的行坐标
     * @param j 遍历位置的列坐标
     * @param r 行极限位置
     * @param c 列极限位置
     * @param grid
     */
    public void dfs(int i,int j,int r,int c,char[][] grid){
        // 如果位置越界或者不满足要求,直接向上返回
        if(i<0||j<0||i==r||j==c||grid[i][j]=='0'){
            return;
        }
        // 当满足要求,将该位置置零,表示已经遍历
        grid[i][j]='0';
        dfs(i+1,j,r,c,grid);
        dfs(i-1,j,r,c,grid);
        dfs(i,j+1,r,c,grid);
        dfs(i,j-1,r,c,grid);
    }
}

你可能感兴趣的:(LeetCode题目解析,leetcode,算法,深度优先遍历,java)