难度简单366
给定一个
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
这题有点不知所措,看了官方题解1还是不太懂:
tx
class Solution {
constexpr static int dx[4] = {0, 1, 0, -1};
constexpr static int dy[4] = {1, 0, -1, 0};
public:
int islandPerimeter(vector<vector<int>>& grid) {
int n = grid.size(), m = grid[0].size();
int res = 0;
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
if(grid[i][j]){
int cnt = 0;
for(int k = 0; k < 4; k++){
int tx = i + dx[k];
int ty = j + dy[k];
// tx < 0, 到左边界; tx >= n 到右边界
// ty < 0 到上边界, ty >= m 到下边界
// grid[tx][ty] == 0 相邻格子是水域
if(tx < 0 || tx >= n || ty < 0 || ty >= m || !grid[tx][ty]){
cnt += 1;
}
}
res += cnt;
}
}
}
return res;
}
};
还是不明白。。。
class Solution {
public:
int direction[4][2] = {0, 1, 1, 0, -1, 0, 0, -1};
int islandPerimeter(vector<vector<int>>& grid) {
int res = 0;
for(int i = 0; i < grid.size(); i++){
for(int j = 0; j < grid[0].size(); j++){
if(grid[i][j] == 1){
for(int k = 0; k < 4; k++){ //上下左右四个方向
int x = i + direction[k][0];
int y = j + direction[k][1];
if (x < 0 || x >= grid.size() || //i在边界上
y < 0 || y >= grid[0].size() || //j 在边界上
grid[x][y] == 0){ //水域
res++;
}
}
}
}
}
return res;
}
};