305. Number of Islands II
You are given an empty 2D binary grid grid
of size m x n
. The grid represents a map where 0
's represent water and 1
's represent land. Initially, all the cells of grid
are water cells (i.e., all the cells are 0
's).
We may perform an add land operation which turns the water at position into a land. You are given an array positions
where positions[i] = [ri, ci]
is the position (ri, ci)
at which we should operate the ith
operation.
Return an array of integers answer
where answer[i]
is the number of islands after turning the cell (ri, ci)
into a land.
An island is surrounded by water and is formed by connecting adjacent lands horizontally or vertically. You may assume all four edges of the grid are all surrounded by water.
Example 1:
Input: m = 3, n = 3, positions = [[0,0],[0,1],[1,2],[2,1]]
Output: [1,1,2,3]
Explanation:
Initially, the 2d grid is filled with water.
- Operation #1: addLand(0, 0) turns the water at grid[0][0] into a land. We have 1 island.
- Operation #2: addLand(0, 1) turns the water at grid[0][1] into a land. We still have 1 island.
- Operation #3: addLand(1, 2) turns the water at grid[1][2] into a land. We have 2 islands.
- Operation #4: addLand(2, 1) turns the water at grid[2][1] into a land. We have 3 islands.
Example 2:
Input: m = 1, n = 1, positions = [[0,0]]
Output: [1]
Constraints:
1 <= m, n, positions.length <= 104
1 <= m * n <= 104
positions[i].length == 2
0 <= ri < m
0 <= ci < n
Follow up: Could you solve it in time complexity O(k log(mn))
, where k == positions.length
?
Solution
int[][] dirs = {{0, 1}, {1, 0}, {-1, 0}, {0, -1}};
public List<Integer> numIslands2(int m, int n, int[][] positions) {
int[] parents = new int[m*n];
Arrays.fill(parents, -1);
int count = 0;
List<Integer> ret = new ArrayList<>();
for(int[] pos : positions) {
int x = pos[0];
int y = pos[1];
int index = x * n + y;
if(parents[index] != -1){
ret.add(count);
continue;
}
parents[index] = index;
count++;
for(int[] dir : dirs) {
int nx = x + dir[0];
int ny = y + dir[1];
int nIndex = nx*n + ny;
if(nx < 0 || nx >= m || ny < 0 || ny >= n || parents[nIndex] == -1) continue;
int nParent = find(parents, nIndex);
if(nParent != index) {
//join
parents[index] = nParent;
index = nParent;
count--;
}
}
ret.add(count;
}
return ret;
}
public int find(int[] parents, int id) {
if(parents[id] == id) return id;
return find(parents, parents[id]);
}
Last updated
Was this helpful?