Untitled

 avatar
unknown
java
5 months ago
1.6 kB
4
Indexable
class Solution {
    int[][] dirs = new int[][] {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
    public List<Integer> numIslands2(int m, int n, int[][] positions) {
        int id = 1;
        int count = 0;
        int[][] grid = new int[m][n];
        List<Integer> list = new ArrayList<>();
        for (int[] p : positions) {
            if (grid[p[0]][p[1]] != 0) {
                list.add(count);
                continue;
            }
            int minNeighbor = Integer.MAX_VALUE;
            Set<Integer> neighbors = new HashSet<>();
            for (int[] dir : dirs) {
                int x = p[0] + dir[0];
                int y = p[1] + dir[1];
                if (x < 0 || y < 0 || x >= m || y >= n || grid[x][y] == 0) {
                    continue;
                }
                neighbors.add(grid[x][y]);
                minNeighbor = Math.min(minNeighbor, grid[x][y]);
            }
            if (neighbors.isEmpty()) {
                grid[p[0]][p[1]] = id;
                id++;
                count++;
            } else {
                grid[p[0]][p[1]] = -1;
                dfs(grid, p[0], p[1], minNeighbor);
                count -= neighbors.size() - 1;
            }
            list.add(count);
        }
        return list;
    }

    private void dfs(int[][] grid, int i, int j, int id) {
        if (i < 0 || j < 0 || i >= grid.length || j >= grid[0].length || grid[i][j] == 0 || grid[i][j] == id) {
            return;
        }
        grid[i][j] = id;
        for (int[] dir : dirs) {
            int x = i + dir[0];
            int y = j + dir[1];
            dfs(grid, x, y, id);
        }
    }
}
Editor is loading...
Leave a Comment