添加0463岛屿的周长 TypeScript版本

This commit is contained in:
leslieCHUENGT
2023-07-27 09:56:18 +08:00
parent 1340cc38d3
commit 3f0966382e

View File

@ -300,6 +300,104 @@ var islandPerimeter = function(grid) {
};
```
TypeScript:
```typescript
/**
* 方法一深度优先搜索DFS
* @param grid 二维网格地图,其中 grid[i][j] = 1 表示陆地, grid[i][j] = 0 表示水域
* @returns 岛屿的周长
*/
function islandPerimeter(grid: number[][]): number {
// 处理特殊情况:网格为空或行列数为 0直接返回 0
if (!grid || grid.length === 0 || grid[0].length === 0) {
return 0;
}
// 获取网格的行数和列数
const rows = grid.length;
const cols = grid[0].length;
let perimeter = 0; // 岛屿的周长
/**
* 深度优先搜索函数
* @param i 当前格子的行索引
* @param j 当前格子的列索引
*/
const dfs = (i: number, j: number) => {
// 如果当前位置超出网格范围或者当前位置是水域grid[i][j] === 0则周长增加1
if (i < 0 || i >= rows || j < 0 || j >= cols || grid[i][j] === 0) {
perimeter++;
return;
}
// 如果当前位置已经访问过grid[i][j] === -1则直接返回
if (grid[i][j] === -1) {
return;
}
// 标记当前位置为已访问(-1避免重复计算
grid[i][j] = -1;
// 继续搜索上、下、左、右四个方向
dfs(i + 1, j);
dfs(i - 1, j);
dfs(i, j + 1);
dfs(i, j - 1);
};
// 遍历整个网格找到第一个陆地格子grid[i][j] === 1并以此为起点进行深度优先搜索
for (let i = 0; i < rows; i++) {
for (let j = 0; j < cols; j++) {
if (grid[i][j] === 1) {
dfs(i, j);
break;
}
}
}
return perimeter;
}
/**
* 方法二:遍历每个陆地格子,统计周长
* @param grid 二维网格地图,其中 grid[i][j] = 1 表示陆地, grid[i][j] = 0 表示水域
* @returns 岛屿的周长
*/
function islandPerimeter(grid: number[][]): number {
// 处理特殊情况:网格为空或行列数为 0直接返回 0
if (!grid || grid.length === 0 || grid[0].length === 0) {
return 0;
}
// 获取网格的行数和列数
const rows = grid.length;
const cols = grid[0].length;
let perimeter = 0; // 岛屿的周长
// 遍历整个网格
for (let i = 0; i < rows; i++) {
for (let j = 0; j < cols; j++) {
// 如果当前格子是陆地grid[i][j] === 1
if (grid[i][j] === 1) {
perimeter += 4; // 周长先加上4个边
// 判断当前格子的上方是否也是陆地如果是则周长减去2个边
if (i > 0 && grid[i - 1][j] === 1) {
perimeter -= 2;
}
// 判断当前格子的左方是否也是陆地如果是则周长减去2个边
if (j > 0 && grid[i][j - 1] === 1) {
perimeter -= 2;
}
}
}
}
return perimeter;
}
```
<p align="center">
<a href="https://programmercarl.com/other/kstar.html" target="_blank">