Making A Large Island

2018-08-30  本文已影响0人  BLUE_fdf9

题目
In a 2D grid of 0s and 1s, we change at most one 0 to a 1.

After, what is the size of the largest island? (An island is a 4-directionally connected group of 1s).

答案
如果你想到的思路是
把某点设成1,然后取整个grid最大island的大小,那么时间复杂度是O(n^3),估计是会TLE的

更高效的方法是,用一遍dfs把每个island的大小算出来,然后用map记录每个cell对应的岛屿大小是多少。
然后,对于每个value为0的cell,试图把它周围的岛屿连起来有多大,返回最大者

class Solution {
    int island = 2;
    int max_island_size = 0;
    int[][] delta = new int[][]{{0, 1},{0 , -1},{1, 0},{-1, 0}};
    Map<Integer, Integer> map = new HashMap<>();

    public int largestIsland(int[][] grid) {
        int island_sum_max = 0;
        for(int i = 0; i < grid.length; i++) {
            for(int j = 0; j < grid[0].length; j++) {
                if(grid[i][j] == 1) {
                    map.put(island, 0);
                    dfs_island_size(grid, i, j);
                    island++;
                }
            }
        }

        for(int i = 0; i < grid.length; i++) {
            for(int j = 0; j < grid[0].length; j++) {
                Set<Integer> set = new HashSet<>();
                if(grid[i][j] == 0) {
                    // Look at 4 directions
                    int island_sum = 0;
                    for(int k = 0; k < 4; k++) {
                        int ni = i + delta[k][0];
                        int nj = j + delta[k][1];
                        if(ni < 0 || ni >= grid.length || nj < 0 || nj >= grid[0].length || grid[ni][nj] == 0)
                            continue;
                        if(!set.contains(grid[ni][nj])) {
                            set.add(grid[ni][nj]);
                            island_sum += map.get(grid[ni][nj]);
                        }
                    }
                    island_sum_max = Math.max(island_sum_max, island_sum);
                }
            }
        }
        return Math.max(island_sum_max + 1, max_island_size);
    }

    public void dfs_island_size(int[][] grid, int i, int j) {
        if(i < 0 || i >= grid.length || j < 0 || j >= grid[0].length || grid[i][j] != 1)
            return;
        // Mark as visited
        grid[i][j] = island;
        // Set size
        int island_size = map.get(island) + 1;
        max_island_size = Math.max(max_island_size, island_size);
        map.put(island, island_size);

        for(int k = 0; k < 4; k++) {
            int ni = i + delta[k][0];
            int nj = j + delta[k][1];
            dfs_island_size(grid, ni, nj);
        }
    }
}
上一篇下一篇

猜你喜欢

热点阅读