iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++实现LeetCode之包围区域的示例分析
  • 814
分享到

C++实现LeetCode之包围区域的示例分析

2023-06-20 18:06:19 814人浏览 薄情痞子
摘要

这篇文章将为大家详细讲解有关c++实现LeetCode之包围区域的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。[LeetCode] 130. Surrounded Regions 包围区域Giv

这篇文章将为大家详细讲解有关c++实现LeetCode之包围区域的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

[LeetCode] 130. Surrounded Regions 包围区域

Given a 2D board containing 'X' and 'O'(the letter O), capture all regions surrounded by 'X'.

A region is captured by flipping all 'O's into 'X's in that surrounded region.

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

Explanation:

Surrounded regions shouldn't be on the border, which means that any 'O' on the border of the board are not flipped to 'X'. Any 'O' that is not on the border and it is not connected to an 'O' on the border will be flipped to 'X'. Two cells are connected if they are adjacent cells connected horizontally or vertically.

这是道关于 XXOO 的题,有点像围棋,将包住的O都变成X,但不同的是边缘的O不算被包围,跟之前那道 Number of Islands 很类似,都可以用 DFS 来解。刚开始我的思路是 DFS 遍历中间的O,如果没有到达边缘,都变成X,如果到达了边缘,将之前变成X的再变回来。但是这样做非常的不方便,在网上看到大家普遍的做法是扫矩阵的四条边,如果有O,则用 DFS 遍历,将所有连着的O都变成另一个字符,比如 \$,这样剩下的O都是被包围的,然后将这些O变成X,把$变回O就行了。代码如下:

解法一:

class Solution {public:    void solve(vector<vector<char> >& board) {        for (int i = 0; i < board.size(); ++i) {            for (int j = 0; j < board[i].size(); ++j) {                if ((i == 0 || i == board.size() - 1 || j == 0 || j == board[i].size() - 1) && board[i][j] == 'O')                    solveDFS(board, i, j);            }        }        for (int i = 0; i < board.size(); ++i) {            for (int j = 0; j < board[i].size(); ++j) {                if (board[i][j] == 'O') board[i][j] = 'X';                if (board[i][j] == '$') board[i][j] = 'O';            }        }    }    void solveDFS(vector<vector<char> > &board, int i, int j) {        if (board[i][j] == 'O') {            board[i][j] = '$';            if (i > 0 && board[i - 1][j] == 'O')                 solveDFS(board, i - 1, j);            if (j < board[i].size() - 1 && board[i][j + 1] == 'O')                 solveDFS(board, i, j + 1);            if (i < board.size() - 1 && board[i + 1][j] == 'O')                 solveDFS(board, i + 1, j);            if (j > 0 && board[i][j - 1] == 'O')                 solveDFS(board, i, j - 1);        }    }};

很久以前,上面的代码中最后一个 if 中必须是 j > 1 而不是 j > 0,为啥 j > 0 无法通过 OJ 的最后一个大数据集合,博主开始也不知道其中奥秘,直到被另一个网友提醒在本地机子上可以通过最后一个大数据集合,于是博主也写了一个程序来验证,请参见验证 LeetCode Surrounded Regions 包围区域的DFS方法,发现 j > 0 是正确的,可以得到相同的结果。神奇的是,现在用 j > 0  也可以通过 OJ 了。

下面这种解法还是 DFS 解法,只是递归函数的写法稍有不同,但是本质上并没有太大的区别,参见代码如下:

解法二:

class Solution {public:    void solve(vector<vector<char>>& board) {        if (board.empty() || board[0].empty()) return;        int m = board.size(), n = board[0].size();        for (int i = 0; i < m; ++i) {            for (int j = 0; j < n; ++j) {                if (i == 0 || i == m - 1 || j == 0 || j == n - 1) {                    if (board[i][j] == 'O') dfs(board, i , j);                }            }           }        for (int i = 0; i < m; ++i) {            for (int j = 0; j < n; ++j) {                if (board[i][j] == 'O') board[i][j] = 'X';                if (board[i][j] == '$') board[i][j] = 'O';            }        }    }    void dfs(vector<vector<char>> &board, int x, int y) {        int m = board.size(), n = board[0].size();        vector<vector<int>> dir{{0,-1},{-1,0},{0,1},{1,0}};        board[x][y] = '$';        for (int i = 0; i < dir.size(); ++i) {            int dx = x + dir[i][0], dy = y + dir[i][1];            if (dx >= 0 && dx < m && dy > 0 && dy < n && board[dx][dy] == 'O') {                dfs(board, dx, dy);            }        }    }};

我们也可以使用迭代的解法,但是整体的思路还是一样的,在找到边界上的O后,然后利用队列 queue 进行 BFS 查找和其相连的所有O,然后都标记上美元号。最后的处理还是先把所有的O变成X,然后再把美元号变回O即可,参见代码如下:

解法三:

class Solution {public:    void solve(vector<vector<char>>& board) {        if (board.empty() || board[0].empty()) return;        int m = board.size(), n = board[0].size();        for (int i = 0; i < m; ++i) {            for (int j = 0; j < n; ++j) {                if (i != 0 && i != m - 1 && j != 0 && j != n - 1) continue;                if (board[i][j] != 'O') continue;                board[i][j] = '$';                queue<int> q{{i * n + j}};                while (!q.empty()) {                    int t = q.front(), x = t / n, y = t % n; q.pop();                    if (x >= 1 && board[x - 1][y] == 'O') {board[x - 1][y] = '$'; q.push(t - n);}                    if (x < m - 1 && board[x + 1][y] == 'O') {board[x + 1][y] = '$'; q.push(t + n);}                    if (y >= 1 && board[x][y - 1] == 'O') {board[x][y - 1] = '$'; q.push(t - 1);}                    if (y < n - 1 && board[x][y + 1] == 'O') {board[x][y + 1] = '$'; q.push(t + 1);}                }            }        }        for (int i = 0; i < m; ++i) {            for (int j = 0; j < n; ++j) {                if (board[i][j] == 'O') board[i][j] = 'X';                if (board[i][j] == '$') board[i][j] = 'O';            }        }    }};

关于“C++实现LeetCode之包围区域的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: C++实现LeetCode之包围区域的示例分析

本文链接: https://www.lsjlt.com/news/298863.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++实现LeetCode之包围区域的示例分析
    这篇文章将为大家详细讲解有关C++实现LeetCode之包围区域的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。[LeetCode] 130. Surrounded Regions 包围区域Giv...
    99+
    2023-06-20
  • C++实现LeetCode(130.包围区域)
    [LeetCode] 130. Surrounded Regions 包围区域 Given a 2D board containing 'X' and ...
    99+
    2024-04-02
  • C++实现LeetCode之区间的示例分析
    这篇文章将为大家详细讲解有关C++实现LeetCode之区间的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。[LeetCode] 228.Summary Ranges 总结区间Given a so...
    99+
    2023-06-20
  • C++实现LeetCode之缺失区间的示例分析
    这篇文章给大家分享的是有关C++实现LeetCode之缺失区间的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。[LeetCode] 163. Missing Ranges 缺失区间Given a sort...
    99+
    2023-06-20
  • C++实现LeetCode的示例分析
    这篇文章主要介绍C++实现LeetCode的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Reverse a linked list from position m to n. ...
    99+
    2023-06-20
  • C++验证LeetCode包围区域的DFS方法
    验证LeetCode Surrounded Regions 包围区域的DFS方法 在LeetCode中的Surrounded Regions 包围区域这道题中,我们发现用DFS方法中...
    99+
    2024-04-02
  • C++实现LeetCode之神奇字典的示例分析
    这篇文章将为大家详细讲解有关C++实现LeetCode之神奇字典的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。[LeetCode] 676.Implement Magic Dictionary ...
    99+
    2023-06-20
  • C++实现LeetCode之岛屿数量的示例分析
    这篇文章主要为大家展示了“C++实现LeetCode之岛屿数量的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C++实现LeetCode之岛屿数量的示例分析”这篇文章吧。[LeetCod...
    99+
    2023-06-20
  • C++实现LeetCode之版本比较的示例分析
    小编给大家分享一下C++实现LeetCode之版本比较的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧![LeetCode] 165.Compare Ver...
    99+
    2023-06-20
  • C++实现LeetCode之替换单词的示例分析
    这篇文章主要介绍C++实现LeetCode之替换单词的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完![LeetCode] 648.Replace Words 替换单词In English, we have a...
    99+
    2023-06-20
  • C++实现LeetCode之求最大间距的示例分析
    这篇文章主要介绍C++实现LeetCode之求最大间距的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完![LeetCode] 164. Maximum Gap 求最大间距Given an unsorted ar...
    99+
    2023-06-20
  • C++实现LeetCode之加油站问题的示例分析
    这篇文章主要介绍C++实现LeetCode之加油站问题的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完![LeetCode] 134.Gas Station 加油站问题There are N ...
    99+
    2023-06-20
  • C++验证包围区域的DFS方法实例
    本篇内容主要讲解“C++验证包围区域的DFS方法实例”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++验证包围区域的DFS方法实例”吧!验证包围区域的DFS方法在LeetCode中的Surro...
    99+
    2023-06-20
  • C++实现LeetCode之前K个高频词的示例分析
    这篇文章主要介绍了C++实现LeetCode之前K个高频词的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。[LeetCode] 692.Top K Frequent ...
    99+
    2023-06-20
  • C++实现LeetCode之前K个高频元素的示例分析
    这篇文章主要为大家展示了“C++实现LeetCode之前K个高频元素的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C++实现LeetCode之前K个高频元素的示例分析”这篇文章吧。[L...
    99+
    2023-06-20
  • C++实现LeetCode之添加和查找单词的示例分析
    这篇文章将为大家详细讲解有关C++实现LeetCode之添加和查找单词的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。[LeetCode] 211.Add and Search Word - Da...
    99+
    2023-06-20
  • C++实现LeetCode之最短子数组求和的示例分析
    这篇文章主要介绍C++实现LeetCode之最短子数组求和的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完![LeetCode] 209. Minimum Size Subarray Sum 最短子数组之和Gi...
    99+
    2023-06-20
  • C++中LeetCode实现单独数字的示例分析
    这篇文章主要介绍了C++中LeetCode实现单独数字的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。[LeetCode] 136.Single Number 单独的...
    99+
    2023-06-20
  • Javascript之作用域、作用域链、闭包的示例分析
    这篇文章主要介绍Javascript之作用域、作用域链、闭包的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!什么是作用域?作用域是一种规则,在代码编译阶段就确定了,规定了变量...
    99+
    2024-04-02
  • C++使用LeetCode实现二叉搜索树的示例分析
    这篇文章将为大家详细讲解有关C++使用LeetCode实现二叉搜索树的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Given an integer n, generate all st...
    99+
    2023-06-20
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作