摘要:原題鏈接邊緣搜索替換法復(fù)雜度時(shí)間空間思路從矩陣的四條邊上的點(diǎn)作為起點(diǎn),搜索連續(xù)的一塊區(qū)域上值為的點(diǎn)并賦為一個(gè)臨時(shí)變量。對(duì)四條邊上所有點(diǎn)都進(jìn)行過這個(gè)步驟后,矩陣內(nèi)剩余的就是被包圍的。
Surrounded Regions
Given a 2D board containing "X" and "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 XAfter running your function, the board should be:
X X X X X X X X X X X X X O X X
原題鏈接
邊緣搜索替換法 復(fù)雜度時(shí)間 O(MN) 空間 O(MN)
思路從矩陣的四條邊上的點(diǎn)作為起點(diǎn),搜索連續(xù)的一塊區(qū)域上值為O的點(diǎn)并賦為一個(gè)臨時(shí)變量。這里我們用BFS或DFS進(jìn)行搜索。對(duì)四條邊上所有點(diǎn)都進(jìn)行過這個(gè)步驟后,矩陣內(nèi)剩余的O就是被包圍的O。此時(shí)再對(duì)所有點(diǎn)遍歷一遍,將臨時(shí)變量賦回O,而剩余的O則賦為X。
注意用隊(duì)列實(shí)現(xiàn)BFS時(shí),賦臨時(shí)變量B時(shí)要在將周邊點(diǎn)加入隊(duì)列時(shí)就賦值,減少while循環(huán)的次數(shù),否則Leetcode會(huì)超時(shí)
代碼廣度優(yōu)先 BFS
public class Solution { public void solve(char[][] board) { for(int i = 0; i < board.length; i++){ for(int j = 0; j < board[0].length; j++){ if((i == 0 || j == 0 || i == board.length - 1 || j == board[0].length - 1) && (board[i][j]=="O")){ Queueq = new LinkedList (); q.offer(i * board[0].length + j); board[i][j] = "B"; while(!q.isEmpty()){ Integer key = q.poll(); int x = key / board[0].length; int y = key % board[0].length; if(x > 0 && board[x-1][y]=="O"){ q.offer((x-1) * board[0].length + y); board[x-1][y] = "B"; } if(x < board.length - 1 && board[x+1][y]=="O"){ q.offer((x+1) * board[0].length + y); board[x+1][y] = "B"; } if(y > 0 && board[x][y-1]=="O"){ q.offer(x * board[0].length + y - 1); board[x][y-1] = "B"; } if(y < board[0].length - 1 && board[x][y+1]=="O"){ q.offer(x * board[0].length + y + 1); board[x][y+1] = "B"; } } } } } for(int i = 0; i < board.length; i++){ for(int j = 0; j < board[0].length; j++){ if(board[i][j]=="O") board[i][j]="X"; if(board[i][j]=="B") board[i][j]="O"; } } } }
深度優(yōu)先 DFS
public class Solution { static class Pair { public int first; public int second; public Pair(int f, int s) { first = f; second = s; } } public void solve(char[][] board) { if(board == null || board.length == 0) { return ; } for(int i = 0; i < board[0].length; ++i) { if(board[0][i] == "O") { markUnflippable(board,0,i); } } for(int i = 0; i < board[board.length-1].length; ++i) { if(board[board.length-1][i] == "O") { markUnflippable(board,board.length-1,i); } } for(int i = 0 ; i < board.length; ++i) { if(board[i][0] == "O") { markUnflippable(board,i,0); } } for(int i =0; i < board.length; ++i) { if(board[i][board[i].length-1] == "O") { markUnflippable(board,i,board[i].length-1); } } // modify the board for(int i = 0; i < board.length; ++i) { for(int j = 0; j < board[i].length; ++j) { if(board[i][j] == "O") { board[i][j] = "X"; } else if(board[i][j] == "U") { board[i][j] = "O"; } } } } public void markUnflippable(char[][] board, int r, int c) { int[] dirX = {-1,0,1,0}; int[] dirY = {0,1,0,-1}; ArrayDequestack = new ArrayDeque<>(); stack.push(new Pair(r,c)); while(!stack.isEmpty()) { Pair p = stack.pop(); board[p.first][p.second] = "U"; for(int i = 0; i < dirX.length; ++i) { if(p.first + dirX[i] >= 0 && p.first + dirX[i] < board.length && p.second + dirY[i] >= 0 && p.second +dirY[i] < board[p.first + dirX[i]].length && board[p.first+dirX[i]][p.second+dirY[i]] == "O") { stack.push(new Pair(p.first+dirX[i],p.second+dirY[i])); } } } } }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/66156.html
摘要:先用處理左右邊界上的換成再用處理上下邊界除去四角的換成把剩下的沒有被處理過,也就是被包圍的置為把所有暫時(shí)置為的不被包圍的換回如當(dāng)前字符的坐標(biāo)越界不是,返回是的都置為,然后迭代其上下左右各點(diǎn) Problem Given a 2D board containing X and O, capture all regions surrounded by X.A region is captur...
摘要:將所有和邊界相連的都標(biāo)記出來。那么當(dāng)我重新遍歷數(shù)組的時(shí)候,剩下的則是被完全包圍的。 題目要求 Given a 2D board containing X and O (the letter O), capture all regions surrounded by X. A region is captured by flipping all Os into Xs in that s...
摘要:題目地址題目描述給定一個(gè)二維的矩陣,包含和字母。找到所有被圍繞的區(qū)域,并將這些區(qū)域里所有的用填充。示例運(yùn)行你的函數(shù)后,矩陣變?yōu)榻獯鹁褪钦宜斜粐@的區(qū)域,然后填充是輕而易舉的事情。利用進(jìn)行連通性構(gòu)建做一個(gè)位置映射 題目地址:https://leetcode-cn.com/probl...題目描述:給定一個(gè)二維的矩陣,包含 X 和 O(字母 O)。 找到所有被 X 圍繞的區(qū)域,并將這些區(qū)...
摘要:并查集包括查詢和聯(lián)合,主要使用不相交集合查詢主要是用來決定不同的成員是否在一個(gè)子集合之內(nèi)聯(lián)合主要是用來把多個(gè)子集合成一個(gè)集合的實(shí)際運(yùn)用計(jì)算機(jī)網(wǎng)絡(luò)檢查集群是否聯(lián)通電路板檢查不同的電路元件是否聯(lián)通初始化聯(lián)通與檢測(cè)與是否聯(lián)通返回聯(lián)通的數(shù) 并查集(Union-Find)包括查詢(Find)和聯(lián)合(Union),主要使用不相交集合(Disjoint-Sets)查詢(Find)主要是用來決定不同的...
摘要:不得不說,對(duì)于這道題而言,是一種很木訥的模板。主函數(shù)按矩陣大小建立一個(gè)類進(jìn)行后續(xù)操作一個(gè)結(jié)點(diǎn)用來連接邊角不可能被圍繞的一個(gè)函數(shù)對(duì)矩陣元素進(jìn)行結(jié)點(diǎn)線性化。同理,,,在主函數(shù)中初始化后調(diào)用。 Surrounded Regions Problem Given a 2D board containing X and O (the letter O), capture all regions s...
閱讀 610·2024-11-06 13:38
閱讀 878·2024-09-10 13:19
閱讀 1055·2024-08-22 19:45
閱讀 1402·2021-11-19 09:40
閱讀 2658·2021-11-18 13:14
閱讀 4310·2021-10-09 10:02
閱讀 2351·2021-08-21 14:12
閱讀 1301·2019-08-30 15:54