圖number-of-islands-leetcode練習題

/**
 * 給定一個由 '1'(陸地)和 '0'(水)組成的的二維網格,計算島嶼的數量。
 * 一個島被水包圍,並且它是通過水平方向或垂直方向上相鄰的陸地連接而成的。
 * 你可以假設網格的四個邊均被水包圍。
 * <p>
 * 示例 1:
 * <p>
 * 輸入:
 * 11110
 * 11010
 * 11000
 * 00000
 * <p>
 * 輸出: 1
 * 示例 2:
 * <p>
 * 輸入:
 * 11000
 * 11000
 * 00100
 * 00011
 * <p>
 * 輸出: 3
 * <p>
 * 來源:力扣(LeetCode)
 * 鏈接:https://leetcode-cn.com/problems/number-of-islands
 * 著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
 */
public class Solution {

    private static char LAND = '1';// 陸地
    private static char WATER = '0';// 水

    private static int[] DX = {-1, 1, 0, 0};
    private static int[] DY = {0, 0, -1, 1};

    public int numIslands(char[][] grid) {
        if (grid == null || grid.length == 0) {
            return 0;
        }
        int count = 0;
        for (int i = 0; i < grid.length; i++) {
            for (int j = 0; j < grid[i].length; j++) {
                char currentChar = grid[i][j];
                if (currentChar == LAND) {
                    count++;
                    dfs(i, j, grid);
                }
            }
        }
        return count;
    }

    private void dfs(int i, int j, char[][] grid) {
        // 遞歸終止條件
        if (i < 0 || i >= grid.length || j < 0 || j >= grid[0].length || grid[i][j] == WATER) {
            return;
        }
        grid[i][j] = WATER;
        for (int k = 0; k < DX.length; k++) {
            dfs(i + DX[k], j + DY[k], grid);
        }
    }

}
變形題
/**
 * 給定一個包含了一些 0 和 1 的非空二維數組 grid 。
 * 一個 島嶼 是由一些相鄰的 1 (代表土地) 構成的組合,這裏的「相鄰」要求兩個 1 必須在水平或者豎直方向上相鄰。
 * 你可以假設 grid 的四個邊緣都被 0(代表水)包圍着。
 * 找到給定的二維數組中最大的島嶼面積。(如果沒有島嶼,則返回面積爲 0 。)
 *
 * 示例 1:
 *
 * [[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]]
 * 對於上面這個給定矩陣應返回 6。注意答案不應該是 11 ,因爲島嶼只能包含水平或垂直的四個方向的 1 。
 *
 * 示例 2:
 *
 * [[0,0,0,0,0,0,0,0]]
 * 對於上面這個給定的矩陣, 返回 0。
 * 注意: 給定的矩陣grid 的長度和寬度都不超過 50。
 *
 * 來源:力扣(LeetCode)
 * 鏈接:https://leetcode-cn.com/problems/max-area-of-island
 * 著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
 */
class Solution {
    private static int LAND = 1;// 陸地
    private static int WATER = 0;// 水

    private static int[] DX = {-1, 1, 0, 0};
    private static int[] DY = {0, 0, -1, 1};

    public int numIslands(int [][] grid) {
        if (grid == null || grid.length == 0) {
            return 0;
        }
        int ans =0;
        for (int i = 0; i < grid.length; i++) {
            for (int j = 0; j < grid[i].length; j++) {
                int currentChar = grid[i][j];
                if (currentChar == LAND) {
                  ans =  Math.max(ans,dfs(i, j, grid));
                }
            }
        }
        return ans;
    }

    private int dfs(int i, int j, int [][] grid) {
        // 遞歸終止條件
        if (i < 0 || i >= grid.length || j < 0 || j >= grid[0].length || grid[i][j] == WATER) {
            return 0;
        }
        int ans = 1;
        grid[i][j] = WATER;
        for (int k = 0; k < DX.length; k++) {
            ans+=dfs(i + DX[k], j + DY[k], grid);
        }
        return ans;
    }
}

public class MainClass {
    public static int[] stringToIntegerArray(String input) {
        input = input.trim();
        input = input.substring(1, input.length() - 1);
        if (input.length() == 0) {
          return new int[0];
        }
    
        String[] parts = input.split(",");
        int[] output = new int[parts.length];
        for(int index = 0; index < parts.length; index++) {
            String part = parts[index].trim();
            output[index] = Integer.parseInt(part);
        }
        return output;
    }
    
    public static int[][] stringToInt2dArray(String input) {
        JsonArray jsonArray = JsonArray.readFrom(input);
        if (jsonArray.size() == 0) {
          return new int[0][0];
        }

        int[][] arr = new int[jsonArray.size()][];
        for (int i = 0; i < arr.length; i++) {
          JsonArray cols = jsonArray.get(i).asArray();
          arr[i] = stringToIntegerArray(cols.toString());
        }
        return arr;
    }
    
    public static void main(String[] args) throws IOException {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        String line;
        while ((line = in.readLine()) != null) {
            int[][] grid = stringToInt2dArray(line);
            int ret = new Solution().maxAreaOfIsland(grid);
            String out = String.valueOf(ret);
            System.out.print(out);
        }
    }
}

 

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