美文网首页
[超时]200. 岛屿数量-广度优先搜索

[超时]200. 岛屿数量-广度优先搜索

作者: gykimo | 来源:发表于2020-06-19 18:17 被阅读0次

https://leetcode-cn.com/problems/number-of-islands/

我的方法一:广度优先搜索

步骤

  1. 优先从左到右,从上到下,找到第一个1(陆地)
  2. 然后以该陆地开始广度优先搜索,每搜索到一个陆地,就设置标志为2(遍历过的陆地),当无法再扩展时,说明周围全是水包围,表示找到一个岛屿
  3. 再开始遍历找到下一个陆地,还是按照第2步开始搜索
  4. 当陆地的数量为0时,表示搜索完毕

初始条件

  1. island_count = 0

边界条件

  1. 陆地数量为0时,返回island_count
  2. 广度搜索时,考虑到二维网格的边界

复杂度

时间复杂度:O(N),每个点被遍历一次
空间复杂度:O(1),不需要额外的空间

超时代码

逻辑应该对,但是会超时

struct Position{
    int x = 0;
    int y = 0;

    Position(){

    }

    Position(int x, int y){
        this->x = x;
        this->y = y;
    }
};

class Solution {
public:
    int numIslands(vector<vector<char>>& grid) {
        if(grid.size() == 0){
            return 0;
        }
        if(grid[0].size() == 0){
            return 0;
        }

        int height = grid.size();
        int width = grid[0].size();
        int island_count = 0;
        
        Position land;
        while(land.x >= 0 && land.y >= 0){
            //find the first land
            bool has_land = false;
            for(int i = land.y; i<grid.size(); i++){
                land.x = -1;
                land.y = -1;
                for(int j = 0; j<grid[i].size(); j++){
                    if(grid[i][j] == '1'){
                        land.x = j;
                        land.y = i;
                        has_land = true;
                        break;
                    }
                }
                if(has_land){
                    break;
                }
            }
            //no land, finish search
            if(!has_land){
                land.x = -1;
                land.y = -1;
                break;
            }

            //bfs
            queue<Position> lands_found;
            lands_found.push(land);
            while(!lands_found.empty()){
                Position p = lands_found.front();
                lands_found.pop();
                grid[p.y][p.x] = '2';//a land walked
                {
                    //check left
                    if(p.x-1 >= 0 && grid[p.y][p.x-1] == '1'){
                        lands_found.push(Position(p.x-1, p.y));
                    }
                    //check right
                    if(p.x+1 < width && grid[p.y][p.x+1] == '1'){
                        lands_found.push(Position(p.x+1, p.y));
                    }
                    //check top
                    if(p.y-1 >= 0 && grid[p.y - 1][p.x] == '1'){
                        lands_found.push(Position(p.x, p.y - 1));
                    }
                    //check bottom
                    if(p.y+1 < height && grid[p.y + 1][p.x] == '1'){
                        lands_found.push(Position(p.x, p.y + 1));
                    }
                }
            }
            island_count++;
        }

        return island_count;
    }
};

相关文章

  • 2.算法-BFS/DFS

    广度优先搜索BFS 200. 岛屿数量[https://leetcode-cn.com/problems/numb...

  • [超时]200. 岛屿数量-广度优先搜索

    https://leetcode-cn.com/problems/number-of-islands/ 我的方法一...

  • 200. 岛屿数量

    200. 岛屿数量

  • LeetCode-200-岛屿数量

    LeetCode-200-岛屿数量 200. 岛屿数量[https://leetcode-cn.com/probl...

  • leetcode算法题学习Java版(1)

    队列和广度优先搜索 岛屿的个数 给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量。一个岛...

  • ARTS第二周

    前言 ARTS第二周 Algorithm 深度优先搜索 题目: 岛屿数量 classSolution{ int[]...

  • 200. 岛屿数量

    我的思路: 采用深度优先搜索,把附近为1的全部进行标记。 对每一个格子遍历进行遍历,若为1且没被标记,则ret++...

  • 200. 岛屿数量

    给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或...

  • 200. 岛屿数量

    只能是水平或竖直来进行切割小岛 在遍历整个矩阵时,如果遇到是1,向东南西北四个方向进行扩散: (1)观察是否越界(...

  • 200. 岛屿数量

    给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。 岛屿总是被水包围,并且每座...

网友评论

      本文标题:[超时]200. 岛屿数量-广度优先搜索

      本文链接:https://www.haomeiwen.com/subject/eljvxktx.html