<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # 0130. 被圍繞的區域 ## 題目地址(130. 被圍繞的區域) <https://leetcode-cn.com/problems/surrounded-regions/> ## 題目描述 ``` <pre class="calibre18">``` 給定一個二維的矩陣,包含 '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'。如果兩個元素在水平或垂直方向相鄰,則稱它們是“相連”的。 ``` ``` ## 前置知識 - DFS ## 公司 - 阿里 - 騰訊 - 百度 - 字節 ## 思路 我們需要將所有被X包圍的O變成X,并且題目明確說了邊緣的所有O都是不可以變成X的。 ![](https://img.kancloud.cn/32/8b/328b6035231ad3235534e9f1789912ac_518x356.jpg) 其實我們觀察會發現,我們除了邊緣的O以及和邊緣O連通的O是不需要變成X的,其他都要變成X。 經過上面的思考,問題轉化為連通區域問題。 這里我們需要標記一下`邊緣的O以及和邊緣O連通的O`。 我們當然可以用額外的空間去存,但是對于這道題目而言,我們完全可以mutate。這樣就空間復雜度會好一點。 整個過程如圖所示: > 我將`邊緣的O以及和邊緣O連通的O` 標記為了 "A" ![](https://img.kancloud.cn/8f/f6/8ff6f2ea5a4aca4d433368a85713df35_819x405.jpg) ## 關鍵點解析 - 二維數組DFS解題模板 - 轉化問題為`連通區域問題` - 直接mutate原數組,節省空間 ## 代碼 - 語言支持:JS,Python3 ``` <pre class="calibre18">``` <span class="hljs-title">/* * @lc app=leetcode id=130 lang=javascript * * [130] Surrounded Regions */</span> <span class="hljs-title">// 將O以及周邊的O轉化為A</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">mark</span>(<span class="hljs-params">board, i, j, rows, cols</span>) </span>{ <span class="hljs-keyword">if</span> (i < <span class="hljs-params">0</span> || i > rows - <span class="hljs-params">1</span> || j < <span class="hljs-params">0</span> || j > cols - <span class="hljs-params">1</span> || board[i][j] !== <span class="hljs-string">"O"</span>) <span class="hljs-keyword">return</span>; board[i][j] = <span class="hljs-string">"A"</span>; mark(board, i + <span class="hljs-params">1</span>, j, rows, cols); mark(board, i - <span class="hljs-params">1</span>, j, rows, cols); mark(board, i, j + <span class="hljs-params">1</span>, rows, cols); mark(board, i, j - <span class="hljs-params">1</span>, rows, cols); } <span class="hljs-title">/** * @param {character[][]} board * @return {void} Do not return anything, modify board in-place instead. */</span> <span class="hljs-keyword">var</span> solve = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">board</span>) </span>{ <span class="hljs-keyword">const</span> rows = board.length; <span class="hljs-keyword">if</span> (rows === <span class="hljs-params">0</span>) <span class="hljs-keyword">return</span> []; <span class="hljs-keyword">const</span> cols = board[<span class="hljs-params">0</span>].length; <span class="hljs-keyword">for</span> (<span class="hljs-keyword">let</span> i = <span class="hljs-params">0</span>; i < rows; i++) { <span class="hljs-keyword">for</span> (<span class="hljs-keyword">let</span> j = <span class="hljs-params">0</span>; j < cols; j++) { <span class="hljs-keyword">if</span> (i === <span class="hljs-params">0</span> || i == rows - <span class="hljs-params">1</span> || j === <span class="hljs-params">0</span> || j === cols - <span class="hljs-params">1</span>) { mark(board, i, j, rows, cols); } } } <span class="hljs-keyword">for</span> (<span class="hljs-keyword">let</span> i = <span class="hljs-params">0</span>; i < rows; i++) { <span class="hljs-keyword">for</span> (<span class="hljs-keyword">let</span> j = <span class="hljs-params">0</span>; j < cols; j++) { <span class="hljs-keyword">if</span> (board[i][j] === <span class="hljs-string">"O"</span>) { board[i][j] = <span class="hljs-string">"X"</span>; } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (board[i][j] === <span class="hljs-string">"A"</span>) { board[i][j] = <span class="hljs-string">"O"</span>; } } } <span class="hljs-keyword">return</span> board; }; ``` ``` Python Code: ``` <pre class="calibre18">``` <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Solution</span>:</span> <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">solve</span><span class="hljs-params">(self, board: List[List[str]])</span> -> <span class="hljs-keyword">None</span>:</span> <span class="hljs-string">""" Do not return anything, modify board in-place instead. """</span> <span class="hljs-title"># 如果數組長或寬小于等于2,則不需要替換</span> <span class="hljs-keyword">if</span> len(board) <= <span class="hljs-params">2</span> <span class="hljs-keyword">or</span> len(board[<span class="hljs-params">0</span>]) <= <span class="hljs-params">2</span>: <span class="hljs-keyword">return</span> row, col = len(board), len(board[<span class="hljs-params">0</span>]) <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">dfs</span><span class="hljs-params">(i, j)</span>:</span> <span class="hljs-string">""" 深度優先算法,如果符合條件,替換為A并進一步測試,否則停止 """</span> <span class="hljs-keyword">if</span> i < <span class="hljs-params">0</span> <span class="hljs-keyword">or</span> j < <span class="hljs-params">0</span> <span class="hljs-keyword">or</span> i >= row <span class="hljs-keyword">or</span> j >= col <span class="hljs-keyword">or</span> board[i][j] != <span class="hljs-string">'O'</span>: <span class="hljs-keyword">return</span> board[i][j] = <span class="hljs-string">'A'</span> dfs(i - <span class="hljs-params">1</span>, j) dfs(i + <span class="hljs-params">1</span>, j) dfs(i, j - <span class="hljs-params">1</span>) dfs(i, j + <span class="hljs-params">1</span>) <span class="hljs-title"># 從外圍開始</span> <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> range(row): dfs(i, <span class="hljs-params">0</span>) dfs(i, col<span class="hljs-params">-1</span>) <span class="hljs-keyword">for</span> j <span class="hljs-keyword">in</span> range(col): dfs(<span class="hljs-params">0</span>, j) dfs(row<span class="hljs-params">-1</span>, j) <span class="hljs-title"># 最后完成替換</span> <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> range(row): <span class="hljs-keyword">for</span> j <span class="hljs-keyword">in</span> range(col): <span class="hljs-keyword">if</span> board[i][j] == <span class="hljs-string">'O'</span>: board[i][j] = <span class="hljs-string">'X'</span> <span class="hljs-keyword">elif</span> board[i][j] == <span class="hljs-string">'A'</span>: board[i][j] = <span class="hljs-string">'O'</span> ``` ``` ## 相關題目 - [200.number-of-islands](200.number-of-islands.html) > 解題模板是一樣的 **復雜度分析** - 時間復雜度:O(row?col)O(row \* col)O(row?col) - 空間復雜度:O(row?col)O(row \* col)O(row?col) 更多題解可以訪問我的LeetCode題解倉庫:<https://github.com/azl397985856/leetcode> 。 目前已經37K star啦。 關注公眾號力扣加加,努力用清晰直白的語言還原解題思路,并且有大量圖解,手把手教你識別套路,高效刷題。 ![](https://img.kancloud.cn/cf/0f/cf0fc0dd21e94b443dd8bca6cc15b34b_900x500.jpg)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看