使用深度優(yōu)先搜索實現(xiàn)標(biāo)記操作。在下面的代碼中,我們把標(biāo)記過的字母 O 修改為字母 A。 復(fù)雜度
classSolution{int[] dx ={1,-1,0,0};int[] dy ={0,0,1,-1};publicvoidsolve(char[][] board){int n = board.length;if(n ==0){return;}int m = board[0].length;Queue<int[]> queue =newLinkedList<int[]>();for(int i =0; i < n; i++){if(board[i][0]=='O'){queue.offer(newint[]{i,0});}if(board[i][m -1]=='O'){queue.offer(newint[]{i, m -1});}}for(int i =1; i < m -1; i++){if(board[0][i]=='O'){queue.offer(newint[]{0, i});}if(board[n -1][i]=='O'){queue.offer(newint[]{n -1, i});}}while(!queue.isEmpty()){int[] cell = queue.poll();int x = cell[0], y = cell[1];board[x][y]='A';for(int i =0; i <4; i++){int mx = x + dx[i], my = y + dy[i];if(mx <0|| my <0|| mx >= n || my >= m || board[mx][my]!='O'){continue;}queue.offer(newint[]{mx, my});}}for(int i =0; i < n; i++){for(int j =0; j < m; j++){if(board[i][j]=='A'){board[i][j]='O';}elseif(board[i][j]=='O'){board[i][j]='X';}}}}}
2. 廣度優(yōu)先搜索
以使用廣度優(yōu)先搜索實現(xiàn)標(biāo)記操作。在下面的代碼中,我們把標(biāo)記過的字母 O 修改為字母 A 時間復(fù)雜度:O(N) 空間復(fù)雜度:O(1)
classSolution{int[] dx ={1,-1,0,0};int[] dy ={0,0,1,-1};publicvoidsolve(char[][] board){int n = board.length;if(n ==0){return;}int m = board[0].length;Queue<int[]> queue =newLinkedList<int[]>();for(int i =0; i < n; i++){if(board[i][0]=='O'){queue.offer(newint[]{i,0});}if(board[i][m -1]=='O'){queue.offer(newint[]{i, m -1});}}for(int i =1; i < m -1; i++){if(board[0][i]=='O'){queue.offer(newint[]{0, i});}if(board[n -1][i]=='O'){queue.offer(newint[]{n -1, i});}}while(!queue.isEmpty()){int[] cell = queue.poll();int x = cell[0], y = cell[1];board[x][y]='A';for(int i =0; i <4; i++){int mx = x + dx[i], my = y + dy[i];if(mx <0|| my <0|| mx >= n || my >= m || board[mx][my]!='O'){continue;}queue.offer(newint[]{mx, my});}}for(int i =0; i < n; i++){for(int j =0; j < m; j++){if(board[i][j]=='A'){board[i][j]='O';}elseif(board[i][j]=='O'){board[i][j]='X';}}}}}
【總結(jié)】
1. 細(xì)節(jié):
1.1 方向定義 int[] dx = {1, -1, 0, 0}; int[] dy = {0, 0, 1, -1}; 1.2 邊界判斷 if (mx < 0 || my < 0 || mx >= n || my >= m || board[mx][my] != ‘O’) { continue; }