Leetcode-200 岛屿数量

朴素写法
visited表示该点是否有被访问过,使用递归在该点的上下左右查找哪些点是和我属于一个岛屿的同伴(也许可以叫做等价类),以一点出发寻找它的最大价值,属于深度优先查找(DFS)。

class Solution {
public:
    int cnt=0;
    int numIslands(vector<vector<char>>& grid) {
        if(grid.empty()) return 0;
        vector<vector<int>> visited (grid.size(),vector<int>(grid[0].size(),0));
        for(int i=0;i<grid.size();i++)
            for(int j=0;j<grid[0].size();j++)
        {
            if(grid[i][j]=='1'&&visited[i][j]==0)
            {
                research(i,j,grid,visited);
                cnt++;
            }
        }
        return cnt;
    }
    void research(int row,int col,vector<vector<char>>& grid,vector<vector<int>>& visited)
    {
        if(row<grid.size()&&col<grid[0].size()&&row>=0&&col>=0&&grid[row][col]=='1'&&visited[row][col]==0)
        { 
            visited[row][col]=1;
            research(row+1,col,grid,visited);
            research(row,col+1,grid,visited);
            research(row,col-1,grid,visited);
            research(row-1,col,grid,visited);
        }
    }
};

后来 我意识到这是件多余的事,对于点的访问,你不需要记得直接毁灭就好。

简单来说,你在一次 i, j中能research到的点都是属于一座岛屿的

class Solution {
public:
    int cnt=0;
    int numIslands(vector<vector<char>>& grid) {
        for(int i=0;i<grid.size();i++)
            for(int j=0;j<grid[0].size();j++)
        {
            if(grid[i][j]=='1')
            {
                research(i,j,grid);
                cnt++;
            }
        }
        return cnt;
    }
    void research(int row,int col,vector<vector<char>>& grid)
    {
        if(row<grid.size()&&col<grid[0].size()&&row>=0&&col>=0&&grid[row][col]=='1')
        {
            grid[row][col]='9';
            research(row+1,col,grid);
            research(row,col+1,grid);
            research(row,col-1,grid);
            research(row-1,col,grid);
        }
    }
};

Leetcode-200 岛屿数量_第1张图片

你可能感兴趣的:(Leetcode)