LeetCode算法题--DFS

0695 岛屿的最大面积

给定一个包含了一些 0 和 1的非空二维数组 grid , 一个 岛屿 是由四个方向 (水平或垂直) 的 1 (代表土地) 构成的组合。你可以假设二维矩阵的四个边缘都被水包围着。找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为0。经典联通块问题。

static int temp;
public static int maxAreaOfIsland(int[][] grid) {
    if (grid==null||grid.length==0){
        return 0;
    }
    int answer=0;
    int visited[][]= new int[grid.length][grid[0].length];
    for (int i = 0; i < grid.length ; i++) {
        for (int j = 0; j < grid[0].length ; j++) {
            if (grid[i][j]==1&&visited[i][j]==0){
                temp=0;
                dfs(grid,visited,i,j);
                answer=Math.max(answer,temp);
            }
        }
    }
    return answer;
}

public static void dfs(int grid[][], int [][]visited,int i, int j){
    if (grid[i][j]==1&&visited[i][j]==0){
        temp++;
        visited[i][j]=1;
        if (isVaild(grid,i+1,j)){
            dfs(grid,visited,i+1,j);
        }
        if (isVaild(grid,i-1,j)){
            dfs(grid,visited,i-1,j);
        }
        if (isVaild(grid,i,j+1)){
            dfs(grid,visited,i,j+1);
        }
        if (isVaild(grid,i,j-1)){
            dfs(grid,visited,i,j-1);
        }
    }
}

public static boolean isVaild(int grid[][], int i, int j){
    if (i>=0&&i<=grid.length-1&&j>=0&&j<=grid[0].length-1){
        return true;
    }
    return false;
}

0200 岛屿数量

给定一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。经典联通块问题。

public static int numIslands(char[][] grid) {
    if (grid.length==0||grid==null){
        return 0;
    }
    int answer=0;
    int visited[][]= new int[grid.length][grid[0].length];
    for (int i = 0; i < grid.length ; i++) {
        for (int j = 0; j < grid[0].length ; j++) {
            if (grid[i][j]=='1'&&visited[i][j]==0){
                dfs(grid,visited,i,j);
                answer++;
            }
        }
    }
    return answer;
}

public static void dfs(char grid[][], int visited[][],int i, int j){
    if (grid[i][j]=='1'&&visited[i][j]==0){
        visited[i][j]=1;
        if (isVaild(grid,i+1,j)){
            dfs(grid,visited,i+1,j);
        }
        if (isVaild(grid,i-1,j)){
            dfs(grid,visited,i-1,j);
        }
        if (isVaild(grid,i,j+1)){
            dfs(grid,visited,i,j+1);
        }
        if (isVaild(grid,i,j-1)){
            dfs(grid,visited,i,j-1);
        }
    }
}

public static boolean isVaild(char grid[][], int i, int j){
    if (i>=0&&i<=grid.length-1&&j>=0&&j<=grid[0].length-1){
        return true;
    }
    return false;
}

0547 朋友圈

给定一个 N * N 的矩阵 M,表示班级中学生之间的朋友关系。如果M[i] [j] = 1,表示已知第 i 个和 j 个学生互为朋友关系,否则为不知道。你必须输出所有学生中的已知的朋友圈总数。

public static int findCircleNum(int[][] M) {
    int count=0;
    int visited[]= new int[M.length];
    for (int i = 0; i < M.length ; i++) {
        if (visited[i]==0){
            dfs(M,visited,i);
            count++;
        }
    }
    return count;
}

public static void dfs(int [][]M, int visited[], int i){
    if (visited[i]==0){
        visited[i]=1;
        for (int j = 0; j < M[0].length; j++) {
            if (M[i][j]==1){
                dfs(M,visited,j);
            }
        }
    }
}

0130 被围绕的区域

给定一个二维的矩阵,包含 'X''O'字母 O)。找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O''X' 填充。

public static void solve(char[][] board) {
    if (board == null || board.length == 0) return;
    int visited[][]= new int[board.length][board[0].length];
    for (int i = 0; i < board.length ; i++) {
        for (int j = 0; j < board[0].length ; j++) {
            if (board[i][j]=='O'&&isEdge(board,i,j)&&visited[i][j]==0){
                dfs(i,j,board,visited);
            }
        }
    }
    for (int i = 0; i < board.length ; i++) {
        for (int j = 0; j < board[0].length; j++) {
            if (visited[i][j]==0){
                board[i][j]='X';
            }
        }
    }
}

public static void dfs(int i, int j, char[][]board, int [][]visited){
    if (board[i][j]=='O'&&visited[i][j]==0){
        visited[i][j]=1;
        //            System.out.println();
        if (isVaild(board,i+1,j)){
            dfs(i+1,j,board,visited);
        }
        if (isVaild(board,i-1,j)){
            dfs(i-1,j,board,visited);
        }
        if (isVaild(board,i,j-1)){
            dfs(i,j-1,board,visited);
        }
        if (isVaild(board,i,j+1)){
            dfs(i,j+1,board,visited);
        }
    }
}

public static boolean isEdge(char[][]board, int i, int j){
    if (i==0||i==board.length-1||j==0||j==board[0].length-1){
        return true;
    }
    return false;
}

public static boolean isVaild(char grid[][], int i, int j){
    if (i>=0&&i<=grid.length-1&&j>=0&&j<=grid[0].length-1){
        return true;
    }
    return false;
}
原创文章 14 获赞 10 访问量 578

猜你喜欢

转载自blog.csdn.net/qq_43672466/article/details/105792336