假设我们有一个二进制值(0s和1s)的2D网格,我们最多将0更改为1。之后,我们必须找出最大的岛的大小是多少?在这里,一个岛是一个4方向(上,下,左,右)连接的1s组。
因此,如果输入类似于[[1,0],[0,1]],则输出将为3,这是因为如果我们将0更改为1并连接两个1,则将得到一个孤岛面积= 3。
为了解决这个问题,我们将遵循以下步骤-
定义大小为4 x 2的数组dir,dir:= {{{1,0},{-1,0},{0,1},{0,-1}}
定义一个函数dfs(),它将使用idx,i,j,网格,
如果(i,j)在网格区域内并且grid [i,j]不等于1,则-
返回0
ret:= 1
grid [i,j]:= idx
对于初始化k:= 0,当k <4时,更新(将k增加1),执行-
ni:= dir [k,0] + i,nj:= dir [k,1] + j
ret:= ret + dfs(grid,ni,nj,idx)
返回ret
从主要方法中,执行以下操作-
ret:= 0,idx:= 2
定义大小为2的数组区域
n:=网格的行数,m:=网格的列数
对于初始化i:= 0,当i <n时,更新(将i增加1),执行-
如果grid [i,j]与1相同,则-
在区域末尾插入dfs(grid,i,j,idx)
ret:= ret的最大值和区域的最后一个元素
(将idx增加1)
对于初始化j:= 0,当j <m时,更新(将j增加1),执行-
对于初始化i:= 0,当i <n时,更新(将i增加1),执行-
定义一组IDX
对于初始化k:= 0,当k <4时,更新(将k增加1),执行-
温度:= 1
对于idxs中的所有元素,请执行以下操作-
如果grid [ni,nj]不为零,则-
将grid [ni,nj]插入idxs
ni:= i + dir [k,0],nj:= j + dir [k,1]
如果ni,nj在网格范围内,则-
temp:= temp + area [it]
(增加1)p +面积[it]
如果grid [i,j]等于0,则-
ret:= ret和temp的最大值
返回ret
让我们看下面的实现以更好地理解-
#include <bits/stdc++.h>
using namespace std;
int dir[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
class Solution {
   public:
   int dfs(vector < vector <int> >& grid, int i, int j, int idx){
      if(i < 0 || j < 0 || i >= grid.size() || j >= grid[0].size()
      || grid[i][j] != 1) return 0;
      int ret = 1;
      grid[i][j] = idx;
      for(int k = 0; k < 4; k++){
         int ni = dir[k][0] + i;
         int nj = dir[k][1] + j;
         ret += dfs(grid, ni, nj, idx);
      }
      return ret;
   }
   int largestIsland(vector<vector<int>>& grid) {
      int ret = 0;
      int idx = 2;
      vector <int > area(2);
      int n = grid.size();
      int m = grid[0].size();
      for(int i = 0; i < n; i++){
         for(int j = 0; j < m; j++){
            if(grid[i][j] == 1){
               area.push_back(dfs(grid, i, j, idx));
               ret = max(ret, area.back());
               idx++;
            }
         }
      }
      for(int i = 0; i < n; i++){
         for(int j = 0; j < m; j++){
            if(grid[i][j] == 0){
               set <int> idxs;
               for(int k = 0; k < 4; k++){
                  int ni = i + dir[k][0];
                  int nj = j + dir[k][1];
                  if(ni < 0 || nj < 0 || ni >= grid.size() ||
                  nj >= grid[0].size()) continue;
                  if(grid[ni][nj]){
                     idxs.insert(grid[ni][nj]);
                  }
               }
               int temp = 1;
               set <int> :: iterator it = idxs.begin();
               while(it != idxs.end()){
                  temp += area[*it];
                  it++;
               }
               ret = max(ret, temp);
            }
         }
      }
      return ret;
   }
};
main(){
   Solution ob;
   vector<vector<int>> v = {{1,0},{0,1}};
   cout << (ob.largestIsland(v));
}{{1,0},{0,1}}输出结果
3