200. Number of Islands

DFS,时间复杂度O(m * n),数据过大栈有限制。

public int numIslands(char[][] grid) {
    if (grid == null || grid.length == 0) return 0;

    int count = 0;
    for (int i = 0; i < grid.length; i++) {
        for (int j = 0; j < grid[0].length; j++) {
            if (grid[i][j] == '1') {
                dfs(grid, i, j);
                count++;
            }
        }
    }
    return count;
}

public void record(char[][] grid, int i, int j) {
    if (i >= grid.length || i < 0 || j >= grid[0].length || j < 0 || grid[i][j] == '0') return;
    grid[i][j] = '0';
    dfs(grid, i + 1, j);
    dfs(grid, i - 1, j);
    dfs(grid, i, j + 1);
    dfs(grid, i, j - 1);
}

最好另外设置一个visited数组,并且简化dfs写法,注意下和79. Word Search不同的地方(不用将visited复原,因为是求一整块地方)

private static final int[][] distance = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
private static boolean[][] visited;

public static int numIslands(char[][] grid) {
    if (grid == null || grid.length == 0 || grid[0].length == 0) return 0;

    visited = new boolean[grid.length][grid[0].length];
    int count = 0;
    for (int i = 0; i < grid.length; i++) {
        for (int j = 0; j < grid[0].length; j++) {
            if (!visited[i][j] && grid[i][j] == '1') {
                searchIslands(grid, i, j);
                count++;
            }
        }
    }
    return count;
}

private static void searchIslands(char[][] grid, int i, int j) {
    if (i < 0 || j < 0 || i >= grid.length || j >= grid[0].length || visited[i][j] || grid[i][j] != '1') return;
    visited[i][j] = true;
    for (int k = 0; k < 4; k++) {
        int newX = i + distance[k][0];
        int newY = j + distance[k][1];
        searchIslands(grid, newX, newY);
    }
}

BFS

public int numIslands(char[][] grid) {
    if (grid == null || grid.length == 0) return 0;
    int count = 0;
    Queue<Integer> queue = new LinkedList<>();
    int[] dx = {0, 0, 1, -1};
    int[] dy = {1, -1, 0, 0};
    int row = grid.length; 
    int col = grid[0].length;
    for (int i = 0; i < row; i++) {
        for (int j = 0; j < col; j++) {
            if (grid[i][j] == '1') {
                count++;
                grid[i][j] = '0';
                queue.offer(i * col + j);

                while (!queue.isEmpty()) {
                    int curNode = queue.poll();
                    int x = curNode / col;
                    int y = curNode % col;
                    for (int k = 0; k < 4; k++) {
                        int newx = x + dx[k];
                        int newy = y + dy[k];
                        if (newx < 0 || newx >= row || newy < 0 || newy >= col || grid[newx][newy] != '1')
                            continue;
                        grid[newx][newy] = '0';
                        queue.offer(newx * col + newy);
                    }
                }
            }
        }
    }
    return count;

一道面试题,斜对角也算连通,并且计算最大个数。

import java.util.Arrays;
import java.util.Scanner;

public class Team {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        in.useDelimiter("[,\n]"); // use comma and newline delimiter
        int row = in.nextInt(), col = in.nextInt();
        char[][] board = new char[row][col];
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < col; j++) {
                board[i][j] = in.next().charAt(0);
            }
        }
        in.close();
        System.out.println("Input row: " + row + " col: " + col);
        System.out.println(Arrays.deepToString(board));
        numberOfTeam(board);
    }

    public static void numberOfTeam(char[][] board) {
        if (board == null || board.length == 0) return;
        int count = 0;
        int depth = 0;
        for (int i = 0; i < board.length; i++) {
            for (int j = 0; j < board[0].length; j++) {
                if (board[i][j] == '1') {
                    depth = Math.max(depth, dfs(board, i, j));
                    count++;
                }
            }
        }
        System.out.println("The number of the team: " + count);
        System.out.println("The number of people in the largest team: " + depth);
        System.out.println(count + "," + depth);
    }

    public static int dfs(char[][] board, int i, int j) {
        if (i < 0 || i >= board.length || j < 0 || j >= board[0].length || board[i][j] == '0') return 0;
        board[i][j] = '0';
        return 1 + dfs(board, i + 1, j)
                + dfs(board, i - 1, j)
                + dfs(board, i, j + 1)
                + dfs(board, i, j - 1)
                + dfs(board, i + 1, j + 1)
                + dfs(board, i + 1, j - 1)
                + dfs(board, i - 1, j + 1)
                + dfs(board, i - 1, j - 1);
    }
    //test case, 6, 8
//            10,10
//            0,0,0,0,0,0,0,0,0,0
//            0,0,0,1,1,0,1,0,0,0
//            0,1,0,0,0,0,0,1,0,1
//            1,0,0,0,0,0,0,0,1,1
//            0,0,0,1,1,1,0,0,0,1
//            0,0,0,0,0,0,1,0,1,1
//            0,1,1,0,0,0,0,0,0,0
//            0,0,0,1,0,1,0,0,0,0
//            0,0,1,0,0,1,0,0,0,0
//            0,1,0,0,0,0,0,0,0,0
}

results matching ""

    No results matching ""