zoukankan      html  css  js  c++  java
  • Number of Islands

    Description

    Given a 2d grid map of '1's (land) and '0's (water), count the number of islands. An island is surrounded by water and is formed by connecting adjacent lands horizontally or vertically. You may assume all four edges of the grid are all surrounded by water.

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/number-of-islands
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    ——————————————————————————————

     深搜,当遇到一个没有被标记的“1”时,以此为起点,标记,继续往这个方向搜索,遇到“1”时,重复上述操作,直到此方向上没有相邻的“1”,换个方向,当当前的“1”的周围并没有相邻的“1”时,回溯到上一个“1”,换个方向,继续。。。

    可以看到,其实就是一个操作,不断重复,所以很显然可以用递归的方法来做(废话,深搜不是递归还是啥。。。)

    下面上代码:

    class Solution {
        static int[] dx = {-1, 1, 0, 0};
        static int[] dy = {0, 0, -1, 1};
        public int numIslands(char[][] grid) {
            int rows = grid.length;
            if(rows == 0){
                return 0;
            }
            int cols = grid[0].length;
            int counts = 0;
            boolean[][] visited = new boolean[rows][cols];
            for(int i = 0; i < rows; i++){
                for(int j = 0; j < cols; j++){
                    if(!visited[i][j] && grid[i][j] == '1'){
                        counts++;
                        DFS(grid, visited, i, j);
                    }
                }
            }
            return counts;
        }
    
        public static void DFS(char[][] grid, boolean[][] visited, int x, int y){
            int rows = grid.length;
            int cols = grid[0].length;
            for(int i = 0; i < 4; i++){
                int r = x + dx[i];
                int c = y + dy[i];
                if(r >= 0 && r < rows && c >= 0 && c < cols){
                    if(!visited[r][c] && grid[r][c] == '1'){
                        visited[r][c] = true;
                        DFS(grid, visited, r, c);
                    }
                }
            }
    
        }
    }

     试了一下广搜,好像也是可以的

    class Solution {
        static int[] dx = {-1, 1, 0, 0};
        static int[] dy = {0, 0, -1, 1};
        static class Node{
            int x, y;
        };
        public int numIslands(char[][] grid) {
            int rows = grid.length;
            if(rows == 0){
                return 0;
            }
            int cols = grid[0].length;
            int counts = 0;
            for(int i = 0; i < rows; i++){
                for(int j = 0; j < cols; j++){
                    if(grid[i][j] == '1'){
                        Node n = new Node();
                        n.x = i;
                        n.y = j;
                        grid[i][j] = '0';
                        BFS(n, grid);
                        counts++;
                    }
                }
            }
            return counts;
        }
    
        public static void BFS(Node n, char[][] grid) {
            int rows = grid.length, cols = grid[0].length;
            Node[] queue = new Node[rows*cols];
            int head = 0, tail = 0;
            queue[tail++] = n;
            while(head < tail) {
                Node node = queue[head++];
                for(int i = 0; i < 4; i++) {
                    int x = node.x + dx[i];
                    int y = node.y + dy[i];
                    if(x >= 0 && x < rows && y >= 0 && y < cols) {
                        if(grid[x][y] == '1') {
                            Node nd = new Node();
                            nd.x = x;
                            nd.y = y;
                            queue[tail++] = nd;
                            grid[x][y] = '0';
                        }
                    }
                }
            }
        }
    }

    但是为甚么我觉得我写的广搜其实就是深搜,囧..

  • 相关阅读:
    GoldenGate 19.1实时文本文件加载攻略
    windows 10 excel 打开超连接提示 组织策略阻止...
    验证ogg同步数据库表无主键表且目标表包含隐藏字段
    配置ogg从Oracle到PostgreSQL的同步复制json数据
    pi
    GoldenGate 19.1 发布
    ogg同步DDL时,源和目标端表空间名称不同的解决思路
    总目录索引(开发精华总结)
    Spring Cloud Nacos分布式配置中心
    Spring Cloud Nacos&Feign负载均衡
  • 原文地址:https://www.cnblogs.com/WakingShaw/p/12971349.html
Copyright © 2011-2022 走看看