이진 값(0과 1)의 2D 그리드가 있다고 가정하고 최대 하나의 0을 1로 변경합니다. 그 후 가장 큰 섬의 크기를 찾아야 합니다. ? 여기서 섬은 4방향(위, 아래, 왼쪽, 오른쪽)으로 연결된 1 그룹입니다.
따라서 입력이 [[1, 0], [0, 1]]과 같으면 출력은 3이 됩니다. 이는 하나의 0을 1로 변경하고 두 개의 1을 연결하면 다음과 같은 섬을 얻을 수 있기 때문입니다. 면적 =3.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
배열 dir 크기 정의:4 x 2, dir :={{1, 0}, { - 1, 0}, {0, 1}, {0, - 1}}
-
dfs() 함수를 정의하면 idx, i, j, grid,
가 필요합니다. -
(i,j)가 그리드 영역 안에 있고 grid[i, j]가 1과 같지 않으면 -
-
0 반환
-
-
렛 :=1
-
그리드[i, j] :=idx
-
초기화 k :=0의 경우 k <4일 때 업데이트(k를 1만큼 증가), −
-
ni :=dir[k, 0] + i, nj :=dir[k, 1] + j
-
ret :=ret + dfs(그리드, ni, nj, idx)
-
-
리턴 렛
-
기본 방법에서 다음을 수행하십시오 -
-
ret :=0, idx :=2
-
크기가 2인 배열 영역 정의
-
n :=그리드의 행 개수, m :=그리드의 열 개수
-
initialize i :=0의 경우, i
-
j 초기화의 경우:=0, j
-
grid[i, j]가 1과 같으면 -
-
영역 끝에 dfs(grid, i, j, idx) 삽입
-
ret :=ret의 최대값과 영역의 마지막 요소
-
(idx를 1씩 증가)
-
-
-
-
initialize i :=0의 경우, i
-
grid[i, j]가 0과 같으면 -
-
하나의 세트 idx 정의
-
초기화 k :=0의 경우 k <4일 때 업데이트(k를 1만큼 증가), −
-
ni :=i + dir[k, 0],nj :=j + dir[k, 1]
-
그리드 범위에 ni,nj이면 -
-
grid[ni, nj]가 0이 아니면 -
-
그리드[ni, nj]를 idxs
에 삽입
-
-
-
-
온도 :=1
-
idxs의 모든 요소에 대해 다음을 수행합니다. -
-
온도 :=온도 + 면적[it]
-
(1)p + area[it]
만큼 증가
-
-
-
ret :=ret 및 temp의 최대값
-
-
리턴 렛
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
예시
#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