`

LeetCode 130 - 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

这个题目用到的方法是图形学中的一个常用方法:Flood fill算法,其实就是从一个点出发对周围区域进行目标颜色的填充。背后的思想就是把一个矩阵看成一个图的结构,每个点看成结点,而边则是他上下左右的相邻点,然后进行一次广度或者深度优先搜索。

 

这道题首先四个边缘上的‘O’点都不是被surrounded的,这是很直接能看出的,麻烦的是与这些边界上的‘O’点毗邻的其他‘O’点,这些点由于跟边缘上的'O'毗邻,所以也米有被‘X’包裹住。所以我们的想法是:把边界上的‘O’点都找出来,对它们做Flood Fill, 把联通的‘O’区域找出来,把这个区域的点统统由‘O’替换为其他字符比如‘$’。这样没有被替换仍旧为‘O’的那些点,就是被‘X’包裹的。这样整体扫描一次,剩下的所有'O'都应该被替换成'X',而'$'那些最终应该是还原成'O'。

 

复杂度分析上,我们先对边缘做Flood fill算法,因为只有是'O'才会进行,而且会被替换成'#',所以每个结点改变次数不会超过一次,因而是O(m*n)的复杂度,最后一次遍历同样是O(m*n),所以总的时间复杂度是O(m*n)。

 

空间上没懂,看了别人的思路。空间上就是递归栈(深度优先搜索)或者是队列(广度优先搜索)的空间,同时存在的空间占用不会超过O(m+n)(以广度优先搜索为例,每次队列中的结点虽然会往四个方向拓展,但是事实上这些结点会有很多重复,假设从中点出发,可以想象最大的扩展不会超过一个菱形,也就是n/2*2+m/2*2=m+n,所以算法的空间复杂度是O(m+n))

 

方法选择当然DFS和BFS都可以,DFS如果用递归来实现,像Flood Fill算法里那样,图形或者矩阵一般很大,递归容易导致堆栈溢出。所以即使用DFS,也要用Stack来写。

public void solve(char[][] board) {
    if(board==null||board.length==0||board[0].length==0) return;
    int m = board.length, n=board[0].length;
    for(int i=0; i<m; i++) {
        if(board[i][0] == 'O') bfs(board, i, 0);
        if(board[i][n-1] == 'O') bfs(board, i, n-1);
    }
    for(int j=0; j<n; j++) {
        if(board[0][j] == 'O') bfs(board, 0, j);
        if(board[m-1][j] == 'O') bfs(board, m-1, j);
    }
    for(int i=0; i<m; i++) {
        for(int j=0; j<n; j++) {
            if(board[i][j] == 'O') board[i][j] = 'X';
            else if(board[i][j] == '#') board[i][j] = 'O';
        }
    }
}

int[][] dir = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
private void bfs(char[][] board, int i, int j) {
    int m = board.length, n = board[0].length;
    Queue<Integer> q = new LinkedList<Integer>();
    q.offer(i*n+j);
    while(!q.isEmpty()) {
        int v = q.poll();
        int row = v/n;
        int col = v%n;
        board[row][col] = '#';
        for(int k=0; k<dir.length; k++) {
            int r = row + dir[k][0];
            int c = col + dir[k][1];
            if(r>=0 && r<m && c>=0 && c<n && board[r][c] == 'O') {
                q.offer(r*n+c);
                board[r][c] = '#';
            }
        }
    }
}

Reference:

http://www.cnblogs.com/EdwardLiu/p/4014864.html

分享到:
评论

相关推荐

    python-leetcode题解之130-Surrounded-Regions

    python python_leetcode题解之130_Surrounded_Regions

    leetcode1-240题中文题解,md格式,java

    7. leetcode-130-Surrounded-Regions.md:第130题,包围的区域,可能涉及二维数组处理和深度优先搜索(DFS)。 8. leetcode-29-Divide-Two-Integers.md:第29题,两数相除,涉及到整数除法和位运算。 9. leetcode-...

    LeetCode---C++实现

    《LeetCode---C++实现》是一本专注于C++编程语言解决LeetCode在线判题平台上的算法问题的书籍。LeetCode是程序员广泛使用的平台,它提供了大量的编程题目来提升编程技能和算法理解,尤其对于准备面试的程序员来说,...

    leetcode-leetcode-cli-plugins:leetcode-cli的第3方插件

    leetcode-cli-plugins leetcode-cli 的第 3 方插件。 什么是 如何使用 如何使用 插件 名称 描述 增强的命令 按公司或标签过滤问题 list 不要在同一台计算机上使 Chrome 的会话过期 login 不要在同一台计算机上使 ...

    leetcode2sumc-leetcode-cli:leetcode-cli

    leetcode-cli 注意:这个存储库是为了临时使用而分叉的。 注意:从 webbrowser 复制 cookie 并使用leetcode user -c可以临时修复不能。 一个享受 leetcode 的高效 cli 工具! 非常感谢 leetcode.com,一个非常棒的...

    leetcode答案-leetcode--python:leetcode--python

    这个压缩包“leetcode--python”显然包含了与LeetCode相关的Python解题代码,可能是一个开源项目,用于存储用户或社区成员解决LeetCode问题的Python实现。 **LeetCode概述** LeetCode提供了一系列的算法和数据结构...

    leetcode26-algo:算法与数据结构

    leetcode26 algo 算法与数据结构,练习代码 语言:java 8 开发工具:vscode,安装插件Java Extension Pack vscode有智能提示,可调试,有重构支持,满足代码练习要求,相比IDEA更轻量级,普通笔记本即可流畅运行。 ...

    leetcode答案-Leetcode--Algo:Leetcode-某事

    leetcode 答案Leetcode---算法 我对 Leetcode 算法问题的回答

    leetcode接口-leetcodeHelper:leetcodeHelper

    leetcode 接口 该项目可帮助您使用首选的 IDE 或带有命令行界面 (CLI) 的编辑器来执行 leetcode。 入门 先决条件 Windows 10、MacOS、Linux Chrome版 &gt;=90.0.4430 安装 # Prepare your virtual environment conda ...

    leetcode答案-leetcode-machine-swift:Xcode中的leetcode解决方案验证

    leetcode-machine-swift :SOS_button: 请帮助在Sources/leetcode-machine-swift/leetcode.swift设置所有 leetcode 问题。 :SOS_button: 在 swift 编码时有 xcode 总是好的。 利用自动补全、类型检查...功能可以帮助...

    离线和leetcode-leetcode-cli-2.6.1:leetcode-cli-2.6.1

    leetcode-cli 一个享受 leetcode 的高效 cli 工具! 非常感谢 leetcode.com,一个非常棒的网站! ⦙⦙⦙⦙⦙⦙⦙⦙ 一个很打问题的方法。 问题来缓解离线思考。 编码前的源代码。 居住和与 leetcode.com。 下载你...

    leetcode2-leetcode-training:算法训练

    leetcode-训练 算法训练。 java $: javac hello.java java $: java hello c $: gcc hello.c 如果没有错误会生成a.out 可执行文件 c $: ./a.out leetcode cli leetcode version leetcode help leetcode help user ...

    zwangZJU#LeetCode-in-python-wznote#LeetCode-python-739-每日温度1

    解题思路思路和LeetCode-python 503.下一个更大元素 II一致,只是这里求的是下标的距离,而不是数值倒序搜索,用到栈,栈里存储索引情况1:若栈为

    leetcode2-21-DAYS-PROGRAMMING-CHALLENGE-ACES:编码CP,探索新事物

    leetcode 2 21 天-编程-挑战-ACES CP、探索新事物、Web 开发 第一天: 解决了 leetcode 问题 - 10 月 4 日 解决 codechef 十月挑战问题 写了一些关于 GFG 的文章 第 2 天: 解决了 leetcode 问题 - 10 月 5 日和 6 ...

    离线和leetcode-leetcode-cn-cli:为leetcode-cn.com工作

    leetcode-cli 一个享受 leetcode 的高效 cli 工具! 非常感谢 leetcode.com,一个非常棒的网站! ⦙⦙⦙⦙⦙⦙⦙⦙ 一个很打问题的方法。 问题来缓解离线思考。 编码前的源代码。 居住和与 leetcode.com。 下载你...

    leetcode中国-leetcode-rust-cn:用Rust刷LeetCode,带中文注释

    leetcode-rust-cn LeetCode solutions in Rust, with Chinese comment. 用 Rust 刷 LeetCode,带中文注释 VSCode 插件 ,插件用法见其 插件 插件 切换到 LeetCode 英文版,然后通过第三方帐号(如 GitHub)登录 用法:...

    LeetCode--Linked List.cpp

    文件中包含了LeetCode中Tag为LinkedList的题目参考代码。

    Vscode安装leetcode插件-LeetCode:力码

    vscode安装leetcode插件力码 依赖关系 Python Python 版本:3.7.* 注意:Python ^3.8.0 会破坏 VSCode python 智能感知和自动完成,因此 ...LeetCode-CLI ...leetcode-tools/leetcode-cli 登录浏览器并提取cookie

    java-leetcode-115-distinct-subsquences

    java java_leetcode-115-distinct-subsquences

    java-leetcode-112-path-sum

    java java_leetcode-112-path-sum

Global site tag (gtag.js) - Google Analytics