leetcode 695. 島嶼的最大面積

解題思路:

遞歸+沉島思想

當前元素是1,如果是第一次遇到,把當前元素置爲0,保證下次遞歸的時候不被訪問。

類比leetcode 200,解題思路相同

 public static void main(String[] args) {
        int[][] grid = {{0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
                {0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0},
                {0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0},
                {0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0},
                {0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0},
                {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0},
                {0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0},
                {0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0}};

        int num = maxAreaOfIsland(grid);
        System.out.println(num);

    }

    /**
     * leetcode 695. 島嶼的最大面積
     *  dfs 遞歸 搜索,使用沉船的思想,第一次遇到就把當前的位置置爲0,保證下次來到的時候不會重複訪問
     *  參考: https://leetcode-cn.com/problems/max-area-of-island/solution/biao-zhun-javadong-tai-gui-hua-jie-fa-100-by-mark-/
     * @Date: 2020/5/25 13:46
     * @Author: fuguowen
     * @Return
     * @Throws
     */
    public static int maxAreaOfIsland(int[][] grid) {
        int max = 0;
        /** 遍歷所有的方格 */
        for (int i = 0; i < grid.length; i++) {
            for (int j = 0; j < grid[0].length; j++) {
                /**  更新最大值  */
                max = Math.max(max, dfs(grid, i, j));
            }
        }
        return max;
    }

    public static int dfs(int[][] grid, int i, int j) {
        /** 數組下標越界 或者當前的位置爲0 直接返回0 */
        if (i < 0 || i >= grid.length || j < 0 || j >= grid[0].length || grid[i][j] == 0) {
            return 0;
        }
        /** 如果當前的島嶼爲1,把當前的島嶼置沉 */
        grid[i][j] = 0;
        /** 遞歸處理,相鄰的四個位置  上下左右 */
        return 1 + dfs(grid, i, j + 1) + dfs(grid, i + 1, j) + dfs(grid, i - 1, j) + dfs(grid, i, j - 1);
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章