1+ /**
2+ * 深度优先-递归
3+ * @param {character[][] } grid
4+ * @return {number }
5+ */
6+ var numIslands = function ( grid ) {
7+ let result = 0 ;
8+
9+ if ( ! grid || grid . length <= 0 ) {
10+ return 0
11+ }
12+ const nr = grid . length
13+ const nc = grid [ 0 ] . length
14+
15+ const dfsHelper = ( grid , r , c ) => {
16+
17+ if ( r < 0 || c < 0 || r >= nr || c >= nc || grid [ r ] [ c ] === '0' ) {
18+ return
19+ }
20+
21+ grid [ r ] [ c ] = '0'
22+ dfsHelper ( grid , r , c - 1 )
23+ dfsHelper ( grid , r , c + 1 )
24+ dfsHelper ( grid , r - 1 , c )
25+ dfsHelper ( grid , r + 1 , c )
26+ }
27+
28+ for ( let i = 0 ; i < nr ; i ++ ) {
29+ for ( let j = 0 ; j < nc ; j ++ ) {
30+ if ( grid [ i ] [ j ] === '1' ) {
31+ ++ result ;
32+ dfsHelper ( grid , i , j )
33+ }
34+ }
35+ }
36+
37+ return result
38+
39+ } ;
40+
41+ /**
42+ * 深度优先-迭代
43+ * @param {character[][] } grid
44+ * @return {number }
45+ */
46+ var numIslands = function ( grid ) {
47+ let result = 0 ;
48+
49+ if ( ! grid || grid . length <= 0 ) {
50+ return 0
51+ }
52+ const nr = grid . length
53+ const nc = grid [ 0 ] . length
54+
55+ const dfsHelper = ( grid , r , c ) => {
56+ const visited = new Map ( )
57+ const stack = [ ]
58+ if ( grid [ r ] [ c ] === '1' ) {
59+ stack . push ( { r, c} )
60+ }
61+
62+ while ( stack . length > 0 ) {
63+ const node = stack . pop ( )
64+ const r = node . r
65+ const c = node . c
66+ visited . set ( `${ r } -${ c } ` , true )
67+ grid [ r ] [ c ] = '0'
68+
69+ if ( r - 1 >= 0 && grid [ r - 1 ] [ c ] === '1' && ! visited . has ( `${ r - 1 } -${ c } ` ) ) {
70+ stack . push ( { r : r - 1 , c} )
71+ }
72+ if ( r + 1 < nr && grid [ r + 1 ] [ c ] === '1' && ! visited . has ( `${ r + 1 } -${ c } ` ) ) {
73+ stack . push ( { r : r + 1 , c} )
74+ }
75+ if ( c - 1 >= 0 && grid [ r ] [ c - 1 ] === '1' && ! visited . has ( `${ r } -${ c - 1 } ` ) ) {
76+ stack . push ( { r, c : c - 1 } )
77+ }
78+ if ( c + 1 < nc && grid [ r ] [ c + 1 ] === '1' && ! visited . has ( `${ r } -${ c + 1 } ` ) ) {
79+ stack . push ( { r, c : c + 1 } )
80+ }
81+ }
82+ }
83+
84+ for ( let i = 0 ; i < nr ; i ++ ) {
85+ for ( let j = 0 ; j < nc ; j ++ ) {
86+ if ( grid [ i ] [ j ] === '1' ) {
87+ ++ result ;
88+ dfsHelper ( grid , i , j )
89+ }
90+ }
91+ }
92+
93+ return result
94+
95+ } ;
96+
97+ /**
98+ * 广度优先 -- 不知道为什么总是超时
99+ * @param {character[][] } grid
100+ * @return {number }
101+ */
102+ var numIslands = function ( grid ) {
103+ let result = 0
104+ if ( ! grid || grid . length <= 0 ) {
105+ return result
106+ }
107+ const nr = grid . length
108+ const nc = grid [ 0 ] . length
109+ const bfsHelper = ( grid , r , c ) => {
110+ const queue = [ ]
111+ if ( grid [ r ] [ c ] === '1' ) {
112+ queue . push ( { r, c} )
113+ }
114+
115+ while ( queue . length > 0 ) {
116+ const node = queue . shift ( )
117+ const { r, c} = node
118+ // visited.set(`${r}-${c}`, true)
119+ grid [ r ] [ c ] = '0'
120+ if ( r - 1 >= 0 && grid [ r - 1 ] [ c ] === '1' ) {
121+ queue . push ( { r : r - 1 , c} )
122+ }
123+ if ( r + 1 < nr && grid [ r + 1 ] [ c ] === '1' ) {
124+ queue . push ( { r : r + 1 , c} )
125+ }
126+ if ( c - 1 >= 0 && grid [ r ] [ c - 1 ] === '1' ) {
127+ queue . push ( { r, c : c - 1 } )
128+ }
129+ if ( c + 1 < nc && grid [ r ] [ c + 1 ] === '1' ) {
130+ queue . push ( { r, c : c + 1 } )
131+ }
132+ }
133+ }
134+ for ( let i = 0 ; i < nr ; i ++ ) {
135+ for ( let j = 0 ; j < nc ; j ++ ) {
136+ if ( grid [ i ] [ j ] === '1' ) {
137+ ++ result
138+ bfsHelper ( grid , i , j )
139+ }
140+ }
141+ }
142+ return result
143+ } ;
0 commit comments