成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

[Leetcode] Surrounded Regions 找出被包圍的區(qū)域

miguel.jiang / 1227人閱讀

摘要:原題鏈接邊緣搜索替換法復(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 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

原題鏈接

邊緣搜索替換法 復(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")){
                    Queue q = 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};
        ArrayDeque stack = 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

相關(guān)文章

  • [LintCode] Surrounded Regions

    摘要:先用處理左右邊界上的換成再用處理上下邊界除去四角的換成把剩下的沒有被處理過,也就是被包圍的置為把所有暫時(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...

    Labradors 評(píng)論0 收藏0
  • leetcode130. Surrounded Regions

    摘要:將所有和邊界相連的都標(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...

    focusj 評(píng)論0 收藏0
  • 力扣(LeetCode)130

    摘要:題目地址題目描述給定一個(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ū)...

    Eminjannn 評(píng)論0 收藏0
  • Leetcode之Union-Find(并查集)

    摘要:并查集包括查詢和聯(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)主要是用來決定不同的...

    roland_reed 評(píng)論0 收藏0
  • 【LC總結(jié)】Union Find系列(Num of Islands I&II/Graph V

    摘要:不得不說,對(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...

    bergwhite 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<