Skip to content

Commit 3f09663

Browse files
committed
添加0463岛屿的周长 TypeScript版本
1 parent 1340cc3 commit 3f09663

File tree

1 file changed

+98
-0
lines changed

1 file changed

+98
-0
lines changed

problems/0463.岛屿的周长.md

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,104 @@ var islandPerimeter = function(grid) {
300300
};
301301
```
302302

303+
TypeScript:
304+
305+
```typescript
306+
/**
307+
* 方法一:深度优先搜索(DFS)
308+
* @param grid 二维网格地图,其中 grid[i][j] = 1 表示陆地, grid[i][j] = 0 表示水域
309+
* @returns 岛屿的周长
310+
*/
311+
function islandPerimeter(grid: number[][]): number {
312+
// 处理特殊情况:网格为空或行列数为 0,直接返回 0
313+
if (!grid || grid.length === 0 || grid[0].length === 0) {
314+
return 0;
315+
}
316+
317+
// 获取网格的行数和列数
318+
const rows = grid.length;
319+
const cols = grid[0].length;
320+
let perimeter = 0; // 岛屿的周长
321+
322+
/**
323+
* 深度优先搜索函数
324+
* @param i 当前格子的行索引
325+
* @param j 当前格子的列索引
326+
*/
327+
const dfs = (i: number, j: number) => {
328+
// 如果当前位置超出网格范围,或者当前位置是水域(grid[i][j] === 0),则周长增加1
329+
if (i < 0 || i >= rows || j < 0 || j >= cols || grid[i][j] === 0) {
330+
perimeter++;
331+
return;
332+
}
333+
334+
// 如果当前位置已经访问过(grid[i][j] === -1),则直接返回
335+
if (grid[i][j] === -1) {
336+
return;
337+
}
338+
339+
// 标记当前位置为已访问(-1),避免重复计算
340+
grid[i][j] = -1;
341+
342+
// 继续搜索上、下、左、右四个方向
343+
dfs(i + 1, j);
344+
dfs(i - 1, j);
345+
dfs(i, j + 1);
346+
dfs(i, j - 1);
347+
};
348+
349+
// 遍历整个网格,找到第一个陆地格子(grid[i][j] === 1),并以此为起点进行深度优先搜索
350+
for (let i = 0; i < rows; i++) {
351+
for (let j = 0; j < cols; j++) {
352+
if (grid[i][j] === 1) {
353+
dfs(i, j);
354+
break;
355+
}
356+
}
357+
}
358+
359+
return perimeter;
360+
}
361+
362+
/**
363+
* 方法二:遍历每个陆地格子,统计周长
364+
* @param grid 二维网格地图,其中 grid[i][j] = 1 表示陆地, grid[i][j] = 0 表示水域
365+
* @returns 岛屿的周长
366+
*/
367+
function islandPerimeter(grid: number[][]): number {
368+
// 处理特殊情况:网格为空或行列数为 0,直接返回 0
369+
if (!grid || grid.length === 0 || grid[0].length === 0) {
370+
return 0;
371+
}
372+
373+
// 获取网格的行数和列数
374+
const rows = grid.length;
375+
const cols = grid[0].length;
376+
let perimeter = 0; // 岛屿的周长
377+
378+
// 遍历整个网格
379+
for (let i = 0; i < rows; i++) {
380+
for (let j = 0; j < cols; j++) {
381+
// 如果当前格子是陆地(grid[i][j] === 1)
382+
if (grid[i][j] === 1) {
383+
perimeter += 4; // 周长先加上4个边
384+
385+
// 判断当前格子的上方是否也是陆地,如果是,则周长减去2个边
386+
if (i > 0 && grid[i - 1][j] === 1) {
387+
perimeter -= 2;
388+
}
389+
390+
// 判断当前格子的左方是否也是陆地,如果是,则周长减去2个边
391+
if (j > 0 && grid[i][j - 1] === 1) {
392+
perimeter -= 2;
393+
}
394+
}
395+
}
396+
}
397+
398+
return perimeter;
399+
}
400+
```
303401

304402
<p align="center">
305403
<a href="https://programmercarl.com/other/kstar.html" target="_blank">

0 commit comments

Comments
 (0)