[LintCode] Number of Islands

Problem

Given a boolean 2D matrix, find the number of islands.

Notice

0 is represented as the sea, 1 is represented as the island. If two 1 is adjacent, we consider them in the same island. We only consider up/down/left/right adjacent.

Example
Given graph:

[
  [1, 1, 0, 0, 0],
  [0, 1, 0, 0, 1],
  [0, 0, 0, 1, 1],
  [0, 0, 0, 0, 0],
  [0, 0, 0, 0, 1]
]

return 3.

Solution

Flood Fill

class Solution {
private:
    int step[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
    
public:
    /**
     * @param grid a boolean 2D matrix
     * @return an integer
     */
    void dfs(int x, int y, vector<vector<bool> > &grid, vector<vector<bool> > &canUse) {
        canUse[x][y] = false;
        
        for(int i = 0; i < 4; i++) {
            int newX = x + step[i][0];
            int newY = y + step[i][1];
            if (0 <= newX && newX < grid.size() && 0 <= newY && newY < grid[0].size() && canUse[newX][newY] && 
            grid[newX][newY]) {
                dfs(newX, newY, grid, canUse);
            }
        }
    }
    
    int numIslands(vector<vector<bool>>& grid) {
        if (grid.size() == 0 || grid[0].size() == 0) {
            return 0;
        }
        
        vector<vector<bool> > canUse(grid.size(), vector<bool>(grid[0].size()));
        for(int i = 0; i < canUse.size(); i++) {
            for(int j = 0; j < canUse[i].size(); j++) {
                canUse[i][j] = true;
            }
        }
        
        int sum = 0;
        for(int i = 0; i < grid.size(); i++) {
            for(int j = 0; j < grid[i].size(); j++) {
                if (grid[i][j] && canUse[i][j]) {
                    dfs(i, j, grid, canUse);
                    sum++;
                }
            }
        }
        
        return sum;
    }
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容