@@ -300,6 +300,104 @@ var islandPerimeter = function(grid) {
300
300
};
301
301
```
302
302
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
+ ```
303
401
304
402
<p align="center">
305
403
<a href="https://programmercarl.com/other/kstar.html " target="_ blank">
0 commit comments