[LeetCode] BFS解决的题目
一.130 Surrounded Regions(https://leetcode.com/problems/surrounded-regions/description/)
题目:

解法:
这道题的意思是将所有被X包围的O都变为X(边缘的不算),我们可以维护一个队列,先把四周的O的位置放进队列中,并把这个位置的值变为Y。然后每次从队列中拿出一个位置,把这个位置四周为O的位置的值变为Y,再把这个位置放进队列(为什么要先变值再进队列呢?在下一道题中会说)。一直到队列为空时,我们就成功地把所有直接或间接地与边缘的O相连的其他O变为了Y,剩余的O就是被X包围的了。然后遍历一遍,把为O的位置变为X,为Y的位置变为O,就得出结果了。
这道题利用到了BFS(宽度优先搜索)的思想,那么用深度优先是否可以呢?据说会TLE,因为图可能很大,递归会导致栈溢出。但是,我认为分别用这两种不同的方法思考一下这道题,可以锻炼利用bfs和dfs解题的思想。
下面是代码:
class Solution {
public:
void solve(vector<vector<char>>& board) {
queue<int> x;
queue<int> y;
for (int i = ; i < board.size(); i++) {
for (int j = ; j < board[i].size(); j++) {
if ((i == || i == board.size() - ||
j == || j == board[i].size() - ) &&
board[i][j] == 'O') {
x.push(i);
y.push(j);
board[i][j] = 'Y';
}
}
}
while (!x.empty() && !y.empty()) {
int i = x.front();
int j = y.front();
x.pop();
y.pop();
if (i - >= && board[i - ][j] == 'O') {
x.push(i - );
y.push(j);
board[i - ][j] = 'Y';
}
if (i + < board.size() && board[i + ][j] == 'O') {
x.push(i + );
y.push(j);
board[i + ][j] = 'Y';
}
if (j - >= && board[i][j - ] == 'O') {
x.push(i);
y.push(j - );
board[i][j - ] = 'Y';
}
if (j + < board[].size() && board[i][j + ] == 'O') {
x.push(i);
y.push(j + );
board[i][j + ] = 'Y';
}
}
for (int i = ; i < board.size(); i++) {
for (int j = ; j < board[i].size(); j++) {
if (board[i][j] == 'Y') {
board[i][j] = 'O';
}
else {
board[i][j] = 'X';
}
}
}
}
};
二. 200 Number of Islands(https://leetcode.com/problems/number-of-islands/description/)
题目:

解法:
这道题的基本思想跟上面一道差不多,也是用bfs,维护一个队列:
当遇到1的时候,把它改为0,进队列;(每次遇到新的island时)
每次把一个位置出队列,并把这个位置四周为1的位置改为0,然后把这些位置放入队列中。当队列为空时,代表已经找到一个island的所有1了,结果+1。
解法是简单的,但我做题的时候还是踩了不少坑:
(1)我用了三层循环去写,因为我想着要判断什么时候所有位置都为0,但其实是多此一举,只需要遍历每一个位置就行了。
(2)我一开始是先把位置放进队列,在出队列的时候才把这个位置的值变为0,但这是不对的:这样会造成一个位置的多次进队列(细想一下吧,出队列的时候才变为0,那在进队列到出队列的过程中这个位置的值还是1,还是会被其他位置检测到,多次加进队列),肯定会TLE。因此一定要先把值变为0,再加进队列。
代码如下:
class Solution {
public:
int numIslands(vector<vector<char> >& grid) {
int ans = ;
queue<int> x, y;
for (int i = ; i < grid.size(); i++ ) {
for (int j = ; j < grid[].size(); j++) {
if (grid[i][j] == '') {
x.push(i);
y.push(j);
grid[i][j] = '';
while (!x.empty() && !y.empty()) {
int i = x.front();
int j = y.front();
x.pop();
y.pop();
if (i - >= && grid[i - ][j] == '') {
x.push(i - );
y.push(j);
grid[i - ][j] = '';
}
if (i + < grid.size() && grid[i + ][j] == '') {
x.push(i + );
y.push(j);
grid[i + ][j] = '';
}
if (j - >= && grid[i][j - ] == '') {
x.push(i);
y.push(j - );
grid[i][j - ] = '';
}
if (j + < grid[].size() && grid[i][j + ] == '') {
x.push(i);
y.push(j + );
grid[i][j + ] = '';
}
}
ans++;
}
}
}
return ans;
}
};
或者:
class Solution {
public:
int numIslands(vector<vector<char> >& grid) {
int ans = ;
for (int i = ; i < grid.size(); i++ ) {
for (int j = ; j < grid[].size(); j++) {
if (grid[i][j] == '') {
bfs(grid, i, j);
ans++;
}
}
}
return ans;
}
void bfs(vector<vector<char> >& grid, int i, int j) {
grid[i][j] = '';
if (i - >= && grid[i - ][j] == '') {
bfs(grid, i - , j);
}
if (i + < grid.size() && grid[i + ][j] == '') {
bfs(grid, i + , j);
}
if (j - >= && grid[i][j - ] == '') {
bfs(grid, i, j - );
}
if (j + < grid[].size() && grid[i][j + ] == '') {
bfs(grid, i, j + );
}
}
};
三.542 01 Matrix
题目:

解法:

代码:
class Solution {
public:
vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) {
vector<vector<int> > ans = matrix;
queue<int> x, y;
for (int i = ; i < ans.size(); i++) {
for (int j = ; j < ans[].size(); j++) {
if (matrix[i][j] == ) {
ans[i][j] = ;
x.push(i);
y.push(j);
}
else {
ans[i][j] = -;
}
}
}
while (!x.empty() && !y.empty()) {
int i = x.front(), j = y.front();
x.pop();
y.pop();
if (i - >= && ans[i - ][j] == -) {
ans[i - ][j] = ans[i][j] + ;
x.push(i - );
y.push(j);
}
if (i + < ans.size() && ans[i + ][j] == -) {
ans[i + ][j] = ans[i][j] + ;
x.push(i + );
y.push(j);
}
if (j - >= && ans[i][j - ] == -) {
ans[i][j - ] = ans[i][j] + ;
x.push(i);
y.push(j - );
}
if (j + < ans[].size() && ans[i][j + ] == -) {
ans[i][j + ] = ans[i][j] + ;
x.push(i);
y.push(j + );
}
}
return ans;
}
};
2018.1.7补充:
上面这一题,重做了一下,想到一个问题: 为什么可以不判断一下就直接ans[i][j] + 1呢?
题目要求离最近的0的距离,而BFS是一层层叠加的、从小到大的,在if处加了ans[i + 1][j] == -1的判断,说明要已修改的值是不能再修改的,满足离最近的0的距离的要求。(描述得不是很清楚,不过自己能回想起就对了)
LeetCode上面还有其他一些用BFS解决的问题,比如Word Ladder,但在前面已经写过了。
[LeetCode] BFS解决的题目的更多相关文章
- 有关dfs、bfs解决迷宫问题的个人见解
可以使用BFS或者DFS方法解决的迷宫问题! 题目如下: kotori在一个n*m迷宫里,迷宫的最外层被岩浆淹没,无法涉足,迷宫内有k个出口.kotori只能上下左右四个方向移动.她想知道有多少出口是 ...
- BFS广搜题目(转载)
BFS广搜题目有时间一个个做下来 2009-12-29 15:09 1574人阅读 评论(1) 收藏 举报 图形graphc优化存储游戏 有时间要去做做这些题目,所以从他人空间copy过来了,谢谢那位 ...
- BFS解决九宫重排问题
问题 1426: [蓝桥杯][历届试题]九宫重排 时间限制: 1Sec 内存限制: 128MB 提交: 215 解决: 47 题目描述 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个 ...
- LeetCode All in One 题目讲解汇总(转...)
终于将LeetCode的免费题刷完了,真是漫长的第一遍啊,估计很多题都忘的差不多了,这次开个题目汇总贴,并附上每道题目的解题连接,方便之后查阅吧~ 如果各位看官们,大神们发现了任何错误,或是代码无法通 ...
- leetcode-78-子集(用bfs解决)
题目描述: 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: nums = [1,2,3] 输出: [ [3], [1] ...
- 利用BFS解决拯救007问题 -- 数据结构
题目: 7-1 拯救007 (30 分) 在老电影“007之生死关头”(Live and Let Die)中有一个情节,007被毒贩抓到一个鳄鱼池中心的小岛上,他用了一种极为大胆的方法逃脱 —— 直接 ...
- LeetCode All in One 题目讲解汇总(持续更新中...)
终于将LeetCode的免费题刷完了,真是漫长的第一遍啊,估计很多题都忘的差不多了,这次开个题目汇总贴,并附上每道题目的解题连接,方便之后查阅吧~ 477 Total Hamming Distance ...
- [LeetCode] 链表反转相关题目
暂时接触到LeetCode上与链表反转相关的题目一共有3道,在这篇博文里面总结一下.首先要讲一下我一开始思考的误区:链表的反转,不是改变节点的位置,而是改变每一个节点next指针的指向. 下面直接看看 ...
- leetcode BFS解题思路
Word Ladder 思路一:单向bfs, 使用visited数组记录哪些已经访问过了, 访问过的就不允许再次入队, 同时这里想到的是使用26个英文字母,枚举可能的取值, 类似brute force ...
随机推荐
- 【Spring】面向切面之AOP
前言 前面已经讲解了bean的装配技术,接着学习Spring中另外一个核心概念:切面. 面向切面 面向切面编程 切面能够帮助模块化横切关注点,横切关注点可以被描述为影响应用的功能,如为业务添加安全和事 ...
- express简介
Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP 工具. 使用 Express 可以快速地搭建一个完整功能的网 ...
- 关于修改extmail附件大小限制的位置
一.修改extmail的webmail.cf文件, SYS_MESSAGE_SIZE_LIMIT = 5242880 注意:以位为单位为5M字节. SYS_MESSAGE_SIZE_LIMIT = x ...
- JS脚本检查密码强度
<html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Con ...
- JS数组filter()、map()、some()、every()、forEach()、lastIndexOf()、indexOf()实例
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat=&qu ...
- wpf值转换器IValueConverter例子
转载:http://blog.163.com/wangzhenguo2005@126/blog/static/37140526201085113430862/ 值转换器可以把一种类型转换成另一种类型. ...
- DOM 节点 课程表
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- DevOps教程
唠叨话 关于德语关我屁事与靠计算逼哥数据,知识点的教学教程. 先简要搭建知识点框架:后逐步完善知识点内容.(暂时提供知识点,大部分未完善,持续更新中.) 注:第一版本,结束于2017年10月18日.其 ...
- windows中vim-airline研究笔记
vim-airline网上的介绍与安装教程一大堆,我就不累述了 但是,在win下如何让airline插件正常显示箭头等特殊字符着实让我头疼了不少. 最初,我是用的monaco字体 但正如你所见,并没有 ...
- 【转】花开正当时,十四款120/128GB SSD横向评测
原文地址:http://www.expreview.com/19604-all.html SSD横评是最具消费指导意义的评测文章,也是各类热门SSD固态硬盘的决斗疆场.SSD评测在行业内已经有不少网站 ...