Number of Islands

思考:与Surrounded Regions类似。并查集 图算法

方法

  • 1、 利用num计数,遇到gird[i][j] = ‘1’,就让num++; 然后查看grid[i - 1][j]和grid[i - 1][j]。如果为1,则unit。在unit中,如果两个类的根不同,则num - 1;并且将两个类的根置为同一个。例如:grid[i - 1][j] == grid[i][j] == 1,则比较grid[i - 1][j]的根rootX和grid[i][j]的根rootY,如果相同则不做运算,如果不同则num - 1,并且置rootX = rootY。(数组中每个元素的根初始化为i*m+j);
  • 2、思考图算法,连通分量问题。DFS和BFS

代码

public class Solution {
    int num = 0;
    int[] unitArray;
    public int numIslands(char[][] grid) {
        if(grid.length == 0 || grid[0].length == 0)
            return 0;
        int n = grid.length;
        int m = grid[0].length;
        unitArray = new int[n * m];
        for (int i = 0; i < unitArray.length; i++)
            unitArray[i] = i;
        if(grid[0][0] == '1')
            num++;
        for(int i = 1; i < n; i++)
            if(grid[i][0] == '1'){
                num++;
                if(grid[i - 1][0] == '1')
                    unit(i * m, i * m - m);
            }
        for(int j = 1; j < m; j++)
            if(grid[0][j] == '1'){
                num++;
                if(grid[0][j - 1] == '1')
                    unit(j, j - 1);
            }
        for(int i = 1; i < n; i ++)
            for(int j = 1; j < m; j++)
                if(grid[i][j] == '1'){
                    num++;
                    if(grid[i][j] == grid[i - 1][j])
                        unit(i * m + j, i * m - m + j);
                    if(grid[i][j] == grid[i][j - 1])
                        unit(i * m + j, i * m + j - 1);
                }
        return num;
    }

    void unit(int i, int j){
        int rootI = find(i);
        int rootJ = find(j);
        if(rootI != rootJ){
            num--;
            unitArray[rootI] = rootJ;
        }
    }

    int find(int index){
        if(unitArray[index] == index) return index;
        unitArray[index] = find(unitArray[index]);
        return unitArray[index];
    }
}

DFS

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

BFS

class Solution {
public:
    void help(vector<vector<char>>& g, int x, int y){
      queue<pair<int,int>> q;
      const int dx[] = {1,-1,0,0};
      const int dy[] = {0,0,1,-1};
      g[x][y] = '0';
      for(q.push(make_pair(x,y)); !q.empty(); q.pop()){
          x = q.front().first;
          y = q.front().second;
          for(int i = 0; i < 4; i++){
              int tx = x + dx[i];
              int ty = y + dy[i];
              if((tx >= 0) && (tx < g.size()) && (ty >=0) && (ty < g[tx].size()) && g[tx][ty] == '1'){
                  q.push(make_pair(tx,ty));
                  g[tx][ty] = '0';
              }
          }
       }
    }
    int numIslands(vector<vector<char>>& grid) {
        int answer = 0;
        for(int i  = 0; i < grid.size(); i++)
            for(int j = 0; j < grid[i].size(); j++)
                if(grid[i][j] == '1'){
                    answer++;
                    help(grid,i,j);                
                }
        return answer;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值