[LeetCode] 130. Surrounded Regions Java
生活随笔
收集整理的這篇文章主要介紹了
[LeetCode] 130. Surrounded Regions Java
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目:Given a 2D board containing?'X'?and?'O'?(the?letter?O), capture all regions surrounded by?'X'.
A region is captured by flipping all?'O's into?'X's in that surrounded region.
For example,
X X X X
X O O X
X X O X
X O X X After running your function, the board should be:
X X X X
X X X X
X X X X
X O X X
題意及分析:給出一個二位矩陣,若存在'O'組成的區域被‘X’包含,那么將改‘O’區域替換為‘X’。我最開始想到的是,用一個visited[row][col]保存該點是否訪問過,然后遍歷矩陣,對遇到的非邊界、為訪問過的‘O’點進行區域查找,將區域用一個List<Integer[]> 保存,若不存在在邊界的‘O’,那么該區域滿足條件(其實就是圖的寬度查找),但是這里用了遞歸,所以運行代碼棧溢出。。。反向思維:從邊界的‘O’點開始查找,如果有何邊界的‘O’點相連的則不用替換(這里用一個'#'先替換),遍歷所有的邊界‘O’,最后對遍歷一次矩陣,將所有的'O'轉化為‘X’,然后在遍歷一次將‘#’轉回為‘O’,這樣可以直接替換,不需要保存可能的值。 內存溢出代碼: public class Solution {public void solve(char[][] board) {int row = board.length; //行數if(row==0) return;int col=board[0].length; //列數boolean[][] visited = new boolean[row][col];for(int i=0;i<row;i++){for(int j=0;j<col;j++){List<Integer[]> union = new ArrayList<>();if((i!=0&&j!=0&&i!=row-1&&j!=col-1)&&(board[i][j]=='O')&&(!visited[i][j])){ //遍歷到非邊界且未被訪問過的'o'union.clear(); // 遍歷到一個未被訪問的o點,就訪問該點能到達的所有'o'點boolean[] isNeedChange = {true}; //判斷該'o'點能達到的區域是否滿足要求 findUnion(visited,union,i,j,board,isNeedChange);if(isNeedChange[0]){ //該區域需要改變,那就改變咯for(int m=0;m<union.size();m++){Integer[] temp = union.get(m);board[temp[0]][temp[1]] = 'X';}}}}}}public void findUnion(boolean[][] visited,List<Integer[]> union,int i,int j,char[][] board,boolean[] isNeedChange){ //查找某一個'o'區域int row = board.length;int col = board[0].length;if(visited[i][j]) return; //該點已經訪問過,直接返回visited[i][j] =true;Integer[] indexs = {i,j};if(isNeedChange[0]==false) {union.clear();return;}else {union.add(indexs);}if(i-1>=0&&board[i-1][j]=='O'){ //上if(i-1==0) isNeedChange[0]=false; //邊界點有為'o'的findUnion(visited,union,i-1,j,board,isNeedChange);}if(i+1<row&&board[i+1][j]=='O'){ //下if(i+1==row-1) isNeedChange[0]=false; //邊界點有為'o'的findUnion(visited,union,i+1,j,board,isNeedChange);}if(j-1>=0&&board[i][j-1]=='O'){ //左if(j-1==0) isNeedChange[0]=false; //邊界點有為'o'的findUnion(visited,union,i,j-1,board,isNeedChange);}if(j+1<col&&board[i][j+1]=='O'){ //右if(j+1==col-1) isNeedChange[0]=false; //邊界點有為'o'的findUnion(visited,union,i,j+1,board,isNeedChange);}} }
?AC代碼:
public class Solution {public void solve(char[][] board) {int row = board.length; //行數if(row==0) return;int col=board[0].length; //列數Queue<Integer[]> queue = new LinkedList<>(); //記錄需要被替換的點,初始時是邊界的點for(int i=0;i<col;i++){if(board[0][i]=='O') { //上邊界點為'O',寬度查找Integer[] index={0,i};queue.offer(index);}}for(int i=0;i<col;i++){if(board[row-1][i]=='O') { //下邊界有'O'Integer[] index={row-1,i};queue.offer(index);}}for(int i=1;i<row-1;i++){ //左邊界點有’‘if(board[i][0]=='O') {Integer[] index={i,0};queue.offer(index);}}for(int i=1;i<row-1;i++){if(board[i][col-1]=='O') {Integer[] index={i,col-1};queue.offer(index);}}while(!queue.isEmpty()){Integer[] index = queue.poll();int m = index[0],n=index[1];if(board[m][n]=='O'){ //初次遍歷到該點board[m][n]='#'; //將該點置為'#'if(m>=1&&board[m-1][n]=='O'){Integer[] temp = {m-1,n};queue.offer(temp);}if(m<row-1&&board[m+1][n]=='O'){Integer[] temp = {m+1,n};queue.offer(temp);}if(n>=1&&board[m][n-1]=='O'){Integer[] temp = {m,n-1};queue.offer(temp);}if(n<col-1&&board[m][n+1]=='O'){Integer[] temp = {m,n+1};queue.offer(temp);}}}for(int i=0;i<row;i++){ //替換被包含的'O'點for (int j=0;j<col;j++){if(board[i][j]=='O')board[i][j]='X';}}for(int i=0;i<row;i++){ //替換回來for (int j=0;j<col;j++){if(board[i][j]=='#')board[i][j]='O';}}return;} }
?
?
?
?
轉載于:https://www.cnblogs.com/271934Liao/p/7239411.html
總結
以上是生活随笔為你收集整理的[LeetCode] 130. Surrounded Regions Java的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: x光片多少钱啊?
- 下一篇: 《上巳日恩赐曲江宴会即事》是哪个时期的作