13Django-在使用者註冊程式碼中完成手機驗證碼的比對
阿新 • • 發佈:2021-12-14
給你一個 m x n 的矩陣 board ,由若干字元 'X' 和 'O' ,找到所有被 'X' 圍繞的區域,並將這些區域裡所有的'O' 用 'X' 填充。
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/surrounded-regions
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
官方題解從邊界向內擴充套件更簡單
心之所向,素履以往 生如逆旅,一葦以航import java.util.HashMap; import java.util.LinkedList; import java.util.Map; class Solution { private int[] dx = {0, 1, 0, -1}; private int[] dy = {1, 0, -1, 0}; public void solve(char[][] board) { if (board == null || board.length == 0 || board[0].length == 0) { return; } Map<Character, Boolean> ok = new HashMap<>(); int n = board.length, m = board[0].length; char idx = 0; for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { if (board[i][j] == 'O') { idx++; LinkedList<int[]> queue = new LinkedList<>(); queue.offer(new int[]{i, j}); board[i][j] = idx; boolean isOk = true; while (!queue.isEmpty()) { int[] node = queue.poll(); for (int k = 0; k < 4; ++k) { int x = dx[k] + node[0]; int y = dy[k] + node[1]; if (x < 0 || x >= n || y < 0 || y >= m) { isOk = false; } else if (board[x][y] == 'O') { queue.offer(new int[]{x, y}); board[x][y] = idx; } } } ok.put(idx, isOk); } } } for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { if (ok.containsKey(board[i][j])) { if (ok.get(board[i][j])) { board[i][j] = 'X'; } else { board[i][j] = 'O'; } } } } } }