mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-08 16:54:50 +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">
|
<p align="center">
|
||||||
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
||||||
|
Reference in New Issue
Block a user