Java解決島嶼周長問題
01 題目
給定一個 row x col
的二維網格地圖 grid
,其中:grid[i][j] = 1
表示陸地, grid[i][j] = 0
表示水域。
網格中的格子 水平和垂直 方向相連(對角線方向不相連)。整個網格被水完全包圍,但其中恰好有一個島嶼(或者說,一個或多個表示陸地的格子相連組成的島嶼)。
島嶼中沒有“湖”(“湖” 指水域在島嶼內部且不和島嶼周圍的水相連)。格子是邊長為 1 的正方形。網格為長方形,且寬度和高度均不超過 100 。計算這個島嶼的周長。
示例 1:
輸入:grid = [[0,1,0,0],[1,1,1,0],[0,1,0,0],[1,1,0,0]]
輸出:16
解釋:它的周長是上面圖片中的 16 個黃色的邊
示例 2:
輸入:grid = [[1]]
輸出:4
示例 3:
輸入:grid = [[1,0]]
輸出:4
提示:
row == grid.length
col == grid[i].length
1 <= row, col <= 100
grid[i][j]
為0
或1
02 知識點
- 二維數組
- DFS,遍歷循環求解
03 我的題解
public class shuzu06 {public static void main(String[] args) {//測試數據int[][] grid=new int[][] {{0,1,0,0},{1,1,1,0},{0,1,0,0},{1,1,0,0}};System.out.println(numSpecial(grid));}
public static int numSpecial(int[][] grid) {int count=0;//用于記錄周長int row = grid.length;//獲取排數int col = grid[0].length;//獲取列數if (row==1&&col==1) {count=4;//當只有一格時,返回周長4return count;}for (int i = 0; i < row; i++) {//循環每一排boolean flag=false;//用于判斷是否數組值為一,即滿足第一條件for (int j = 0; j < col; j++) {//循環每列,默認初始每塊小島周長為4int bolder=4;if (grid[i][j]==1) {//滿足第一條件,執行第二語句flag=true;}if (flag) {//分兩種情況討論,周圍兩排是否有小島和周圍兩列是否有小島if (row>1) {//當處于中間排而不是兩邊排時,判斷兩邊是否有小島,有則該小島的周長減一if (i>0&&i<row-1) {if (grid[i-1][j]==1) {bolder--;}if (grid[i+1][j]==1) {bolder--;} //當處于兩邊排時,判斷另邊是否有小島,有則該小島的周長減一}else if (i==0) {if (grid[i+1][j]==1) {bolder--;}} else {if (grid[i-1][j]==1) {bolder--;}} }//周圍兩列與周圍兩排原理相同if (col>1) {if (j>0&&j<col-1) {if (grid[i][j-1]==1) {bolder--;}if (grid[i][j+1]==1) {bolder--;}}else if (j==0) {if (grid[i][j+1]==1) {bolder--;}} else {if (grid[i][j-1]==1) {bolder--;}}}}//總周長加上該小島周長,并把循環默認改為falseif (flag) {count+=bolder;flag=false;}}}return count;
}
}
?
?