zoukankan      html  css  js  c++  java
  • LeetCode200. 岛屿数量

    思路:本题是经典的Flood Fill(泛洪)问题,即染色问题 或 颜色填充问题。

        这类问题需要把与(i,j)相连接的岛屿都标记上,而不是在其中找到某个序列或者某个值,所以只标记true,不需要进行状态重置。

    代码1(修改输入数据):

    class Solution {
        public int numIslands(char[][] grid) {
            int count = 0;
            int m = grid.length;
            if (m == 0) return 0;
            int n = grid[0].length;
            for (int i = 0; i < m; i++) {
                for (int j = 0; j < n; j++) {
                    if (grid[i][j] == '1') {
                        dfs(grid, i, j);
                        count ++;
                    }
                }
            }
            return count;
        }
        private void dfs(char[][] grid, int x, int y) {
            if (x < 0 || x >= grid.length || y < 0 || y >= grid[0].length) return;
            // 如果这个格子不是岛屿,返回。有两种情况:'0'海洋格子。'2'陆地格子(已遍历过)
            if (grid[x][y] != '1') return;
            grid[x][y] = '2'; // 避免重复遍历"兜圈子",标记已遍历过的格子
            dfs(grid, x - 1, y);
            dfs(grid, x, y + 1);
            dfs(grid, x + 1, y);
            dfs(grid, x, y - 1);
        }
    }

    代码2(设置vis数组):

    class Solution {
        public int numIslands(char[][] grid) {
            if (grid == null || grid.length == 0) return 0;
            int count = 0;
            int m = grid.length;
            int n = grid[0].length;
            boolean[][] visited = new boolean[m][n];
            for (int i = 0; i < m; i++) {
                for (int j = 0; j < n; j++) {
                    if (grid[i][j] == '1' && !visited[i][j]) {
                        dfs(grid, i, j, visited);
                        count ++;
                    }
                }
            }
            return count;
        }
        private void dfs(char[][] grid, int x, int y, boolean[][] visited) {
            // 越界判断  以及 是否访问过 判断
            if (x < 0 || x >= grid.length || y < 0 || y >= grid[0].length || visited[x][y]) return;
            if (grid[x][y] == '0') return;
            visited[x][y] = true;
            dfs(grid, x - 1, y, visited);
            dfs(grid, x, y + 1, visited);
            dfs(grid, x + 1, y, visited);
            dfs(grid, x, y - 1, visited);
        }
    }
  • 相关阅读:
    象限极角排序
    并查集与二部图
    POJ 1743 后缀数组不重叠最长重复子串
    POJ 2104 【主席树】【区间第K大】
    两串前缀最长后缀
    Codeforces 450D Jzzhu and Cities [heap优化dij]
    Codeforces 119C DP
    HDU 3068 [最长回文子串]
    Codeforces 132E Bits of merry old England 【最小费用最大流】
    ZOJ 3911Prime Query [素数处理 + 线段树]
  • 原文地址:https://www.cnblogs.com/HuangYJ/p/14204893.html
Copyright © 2011-2022 走看看