給定一個 row x col 的二維網格地圖 grid ,其中:grid[i][j] = 1 表示陸地, grid[i][j] = 0 表示水域。
網格中的格子 水平和垂直 方向相連(對角線方向不相連)。整個網格被水完全包圍,但其中恰好有一個島嶼(或者說,一個或多個表示陸地的格子相連組成的島嶼)。
島嶼中沒有“湖”(“湖” 指水域在島嶼內部且不和島嶼周圍的水相連)。格子是邊長為 1 的正方形。網格為長方形,且寬度和高度均不超過 100 。計算這個島嶼的周長。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/island-perimeter
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
方法一
官方答案,遍歷每個方格,判斷方格的四條邊是否是邊界或者與水域接觸
class Solution {static int[] dx = {0,0,-1,1};static int[] dy = {1,-1,0,0};public int islandPerimeter(int[][] grid) {int res = 0;int n = grid.length;int m = grid[0].length;for(int i = 0;i<n;i++){for(int j = 0;j<m;j++){if(grid[i][j]==1){int cnt = 0;/*這個for語句是判斷每個方格的四條邊設計的,k值不同,代表的邊不同*/for(int k = 0;k<4;k++){int tx = i + dx[k];int ty = j + dy[k];if(tx<0||tx>=n||ty<0||ty>=m||grid[tx][ty]==0){cnt++;}}res += cnt;}}}return res;}
}
開頭兩個static數組和后文的
for(int k = 0;k<4;k++){int tx = i + dx[k];int ty = j + dy[k];if(tx<0||tx>=n||ty<0||ty>=m||grid[tx][ty]==0){cnt++;}設計的很妙
方法二
深度優先遍歷
class Solution {static int[] dx = {0,0,-1,1};static int[] dy = {1,-1,0,0};public int islandPerimeter(int[][] grid) {int res = 0;int n = grid.length;int m = grid[0].length;for(int i = 0;i<n;i++){for(int j = 0;j<m;j++){if(grid[i][j]==1){res += dfs(i,j,n,m,grid);}}}return res;}public int dfs(int x,int y,int n,int m,int[][]grid){if(x<0||x>=n||y<0||y>=m||grid[x][y]==0){return 1;}if(grid[x][y]==2){return 0;}grid[x][y]=2;int cnt = 0;cnt += dfs(x,y+1,n,m,grid);cnt += dfs(x,y-1,n,m,grid);cnt += dfs(x+1,y,n,m,grid);cnt += dfs(x-1,y,n,m,grid);return cnt;}
}
和題目島嶼的數量很像