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

[pull] master from youngyangyang04:master #328

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
pull merged 6 commits into AlgorithmAndLeetCode:master from youngyangyang04:master
Aug 8, 2023
Merged
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
98 changes: 98 additions & 0 deletions problems/0463.岛屿的周长.md
View file Open in desktop
Original file line number Diff line number Diff line change
Expand Up @@ -302,6 +302,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">
Expand Down

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