一.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解决的题目的更多相关文章

  1. 有关dfs、bfs解决迷宫问题的个人见解

    可以使用BFS或者DFS方法解决的迷宫问题! 题目如下: kotori在一个n*m迷宫里,迷宫的最外层被岩浆淹没,无法涉足,迷宫内有k个出口.kotori只能上下左右四个方向移动.她想知道有多少出口是 ...

  2. BFS广搜题目(转载)

    BFS广搜题目有时间一个个做下来 2009-12-29 15:09 1574人阅读 评论(1) 收藏 举报 图形graphc优化存储游戏 有时间要去做做这些题目,所以从他人空间copy过来了,谢谢那位 ...

  3. BFS解决九宫重排问题

    问题 1426: [蓝桥杯][历届试题]九宫重排 时间限制: 1Sec 内存限制: 128MB 提交: 215 解决: 47 题目描述 如下面第一个图的九宫格中,放着  1~8  的数字卡片,还有一个 ...

  4. LeetCode All in One 题目讲解汇总(转...)

    终于将LeetCode的免费题刷完了,真是漫长的第一遍啊,估计很多题都忘的差不多了,这次开个题目汇总贴,并附上每道题目的解题连接,方便之后查阅吧~ 如果各位看官们,大神们发现了任何错误,或是代码无法通 ...

  5. leetcode-78-子集(用bfs解决)

    题目描述: 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: nums = [1,2,3] 输出: [ [3],   [1] ...

  6. 利用BFS解决拯救007问题 -- 数据结构

    题目: 7-1 拯救007 (30 分) 在老电影“007之生死关头”(Live and Let Die)中有一个情节,007被毒贩抓到一个鳄鱼池中心的小岛上,他用了一种极为大胆的方法逃脱 —— 直接 ...

  7. LeetCode All in One 题目讲解汇总(持续更新中...)

    终于将LeetCode的免费题刷完了,真是漫长的第一遍啊,估计很多题都忘的差不多了,这次开个题目汇总贴,并附上每道题目的解题连接,方便之后查阅吧~ 477 Total Hamming Distance ...

  8. [LeetCode] 链表反转相关题目

    暂时接触到LeetCode上与链表反转相关的题目一共有3道,在这篇博文里面总结一下.首先要讲一下我一开始思考的误区:链表的反转,不是改变节点的位置,而是改变每一个节点next指针的指向. 下面直接看看 ...

  9. leetcode BFS解题思路

    Word Ladder 思路一:单向bfs, 使用visited数组记录哪些已经访问过了, 访问过的就不允许再次入队, 同时这里想到的是使用26个英文字母,枚举可能的取值, 类似brute force ...

随机推荐

  1. JavaWeb(四)EL表达式

    前言 前面详细的说明了什么是JSP和它的一些元素,这篇给大家介绍一下的是EL表达式. 用EL表达式,能更好的使用JSP中的各种内置对象和作用域. 楼主作为大四狗马上要出去面试了,内心很紧张!!! 一. ...

  2. spring 内部工作机制(二)

    本章节讲Spring容器从加载配置文件到创建出一个完整Bean的作业流程及参与的角色. Spring 启动时读取应用程序提供的Bean配置信息,并在Spring容器中生成一份相应的Bean配置注册表, ...

  3. PE格式第四讲,数据目录表之导入表,以及IAT表

    PE格式第四讲,数据目录表之导入表,以及IAT表 一丶IAT(地址表) 首先我们思考一个问题,程序加载的时候会调用API,比如我们以前写的标准PE 那么他到底是怎么去调用的? 他会Call 下边的Jm ...

  4. Jmeter连接mysql数据库

    1.下载 MySQL JDBC driver,并拷贝到jmeter的lib目录下. 2.创建JDBC Connection Configuration 需要填入的信息: Variable Name:M ...

  5. NopCommerce 3. Controller 分析

    1. 继承关系,3个abstract类 System.Web.Mvc.Controller Nop.Web.Framework.Controllers.BaseController Nop.Admin ...

  6. 图片首尾平滑轮播(JS原生方法—节流)<原创>

    首先给出HTML代码,要注意轮播图片表(#list)末尾加上第一个图片1.jpg,在首部加上最后一个图片5.jpg. <!DOCTYPE html> <html lang=" ...

  7. js 查询 添加 删除 练习

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  8. vim下单行长文本的时候卡顿解决办法

    在vim编辑文件时,若单行过长,可能会导致vim卡顿,严重影响使用体验 估计是syntax匹配效率过滥导致.. 偶尔发现了一个临时的解决办法就是关掉syntax然后再打开,即在命令模式下 :synta ...

  9. Entity Framework Core 2.0 使用入门

    一.前言 Entity Framework(后面简称EF)作为微软家的ORM,自然而然从.NET Framework延续到了.NET Core.以前我也嫌弃EF太重而不去使用它,但是EF Core(E ...

  10. Python3中urllib详细使用方法(header,代理,超时,认证,异常处理) 转

    urllib是python的一个获取url(Uniform Resource Locators,统一资源定址器)了,我们可以利用它来抓取远程的数据进行保存哦,下面整理了一些关于urllib使用中的一些 ...