Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit bf51d47

Browse files
Merge pull request youngyangyang04#2210 from leslieCHUENGT/fix/islandPerimeter
添加0463岛屿的周长 TypeScript版本
2 parents 8817579 + 3f09663 commit bf51d47

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
@@ -302,6 +302,104 @@ var islandPerimeter = function(grid) {
302302
};
303303
```
304304

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

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

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /