mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-07 15:45:40 +08:00
添加0463岛屿的周长 TypeScript版本
This commit is contained in:
@ -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">
|
||||
|
Reference in New Issue
Block a user