剑指 Offer II 105. 岛屿的最大面积(695. 岛屿的最大面积)

题目:

 

 

 

思路:

【1】深度优先搜索

【2】广度优先搜索

代码展示:

广度优先搜索:

//时间7 ms击败6.66%
//内存41.3 MB击败88.39%
//时间复杂度:O(m×n)。其中 m 是给定网格中的行数,n 是列数。我们访问每个网格最多一次。
//空间复杂度:O(m×n),队列中最多会存放所有的土地,土地的数量最多为 m×n 块,因此使用的空间为 O(m×n)。
class Solution {
    public int maxAreaOfIsland(int[][] grid) {
        int ans = 0;
        for (int i = 0; i != grid.length; ++i) {
            for (int j = 0; j != grid[0].length; ++j) {
                int cur = 0;
                Queue<Integer> queuei = new LinkedList<Integer>();
                Queue<Integer> queuej = new LinkedList<Integer>();
                queuei.offer(i);
                queuej.offer(j);
                while (!queuei.isEmpty()) {
                    int cur_i = queuei.poll(), cur_j = queuej.poll();
                    if (cur_i < 0 || cur_j < 0 || cur_i == grid.length || cur_j == grid[0].length || grid[cur_i][cur_j] != 1) {
                        continue;
                    }
                    ++cur;
                    //这里将小岛变海域,防止二次遍历
                    grid[cur_i][cur_j] = 0;
                    int[] di = {0, 0, 1, -1};
                    int[] dj = {1, -1, 0, 0};
                    for (int index = 0; index != 4; ++index) {
                        int next_i = cur_i + di[index], next_j = cur_j + dj[index];
                        queuei.offer(next_i);
                        queuej.offer(next_j);
                    }
                }
                ans = Math.max(ans, cur);
            }
        }
        return ans;
    }
}

 

深度优先搜索:

//时间1 ms击败100%
//内存41.4 MB击败68.78%
//时间复杂度:O(m×n)。其中 m 是给定网格中的行数,n 是列数。我们访问每个网格最多一次。
//空间复杂度:O(m×n),递归的深度最大可能是整个网格的大小,因此最大可能使用 O(m×n) 的栈空间。
class Solution {
    int maxArea = 0, curArea = 0;
    public int maxAreaOfIsland(int[][] grid) {
        for(int i = 0; i < grid.length; i++){
            for(int j = 0; j < grid[0].length; j++){
                if(grid[i][j] == 1){
                    curArea = 0;
                    infect(i, j, grid);
                    maxArea = Math.max(maxArea, curArea);
                }
            }
        }
        return maxArea;
    }
    public void infect(int x, int y, int[][] grid){
        //限制条件(首先是上下左右边界,其次是小岛土地判断)
        if(x < 0 || y < 0 || x >= grid.length || y >= grid[0].length || grid[x][y] == 0){
            return;
        }
        if(grid[x][y] == 1){
            curArea++;
            //这里是将岛屿遍历完后变为海域,防止二次遍历
            grid[x][y] = 0;
        }
        infect(x - 1, y, grid);
        infect(x + 1, y, grid);
        infect(x, y - 1, grid);
        infect(x, y + 1, grid);

    }
}

 

posted @ 2023-04-11 12:26  忧愁的chafry  阅读(11)  评论(0编辑  收藏  举报