【LeetCode】130.被围绕的区域
生活随笔
收集整理的這篇文章主要介紹了
【LeetCode】130.被围绕的区域
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、題目描述
給定一個二維的矩陣,包含 ‘X’ 和 ‘O’(字母 O)。
找到所有被 ‘X’ 圍繞的區域,并將這些區域里所有的 ‘O’ 用 ‘X’ 填充。
二、示例
示例:
X X X X X O O X X X O X X O X X運行你的函數后,矩陣變為:
X X X X X X X X X X X X X O X X解釋:
被圍繞的區間不會存在于邊界上,換句話說,任何邊界上的 ‘O’ 都不會被填充為 ‘X’。 任何不在邊界上,或不與邊界上的 ‘O’ 相連的 ‘O’ 最終都會被填充為 ‘X’。如果兩個元素在水平或垂直方向相鄰,則稱它們是“相連”的。
三、分析
與邊界"O"有聯系的區域都不會填充,其他的會被填充。
==》
本題用到了深度優先遍歷和回溯法,解題方式也是之前未見過的,方法是很巧妙的。
首先想到的是對邊界的’0’進行標記,與邊界’0’相連的’0’也進行標記,并標記為’+’;
其次查找連續’0’的方法,采用的是深度優先遍歷,實現的過程回溯法。
最后沒有被標記的’0’即為被包圍的,將會被修改為’X’,而’+‘將被恢復為’0’。
四、實現
class Solution { public:void dfs(vector<vector<char>>& board, int row, int col){if(row < 0 || row >= board.size() || col < 0 || col >= board[0].size())return;if(board[row][col] != 'O')return;board[row][col] = '+';dfs(board, row + 1, col);dfs(board, row, col + 1);dfs(board, row - 1, col);dfs(board, row, col - 1);}void solve(vector<vector<char>>& board) {if(board.size() <= 1 || board[0].size() <= 2)return;for(int i = 0; i < board.size(); i ++){if(board[i][0] == 'O')dfs(board, i, 0);if(board[i][board[0].size() - 1] == 'O')dfs(board, i, board[0].size() - 1);}for(int i = 0; i < board[0].size(); i ++){if(board[0][i] == 'O')dfs(board, 0, i);if(board[board.size() - 1][i] == 'O')dfs(board, board.size() - 1, i);}// 對'+'進行恢復,對'0'進行修改for(int i = 0; i < board.size(); i ++){for(int j = 0; j < board[0].size(); j ++){if(board[i][j] == '+')board[i][j] = 'O';else if(board[i][j] == 'O')board[i][j] = 'X';}}} };總結
以上是生活随笔為你收集整理的【LeetCode】130.被围绕的区域的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【TensorFlow】笔记3:MNIS
- 下一篇: 【TensorFlow】笔记4:图像识别