【leetcode】Surrounded Regions(middle)☆
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
思路:
反向思考,先找到没有被包围的区域,标记为‘+’,再把标为‘+’的区域标为‘O',标为’O'的区域改为‘X'。没有被包围的区域一定是与最外圈的’O'相连的区域,所以要先遍历区域的上下左右边界,找到‘O'的地方。接下来的问题是如何把所有与最外层‘O'相连的区域标记上。有两种思路:BFS和DFS。
所谓BFS是指把当前标记位置的上下左右都标记一遍,然后再标记相邻点的上下左右位置。不需递归,用队列。
DFS是指把当前标记位置的向一个方向标记,比如一直向左,直到没有可标记的,再换一个方向。需要递归。
代码里面BFS可以通过,DFS栈溢出了。
void solve(vector<vector<char>> &board) {
if(board.size() == ) return;
int rowNum = board.size();
int colNum = board[].size();
//遍历最外面一圈,找‘O'
//最上
for(int j = ; j < colNum; j++)
{
if(board[][j] == 'O')
BFS(board, , j);
}
//最下
for(int j = ; j < colNum; j++)
{
if(board[rowNum - ][j] == 'O')
BFS(board, rowNum - , j);
}
//最左
for(int i = ; i < rowNum; i++)
{
if(board[i][] == 'O')
BFS(board, i, );
}
//最右
for(int i = ; i < rowNum; i++)
{
if(board[i][colNum - ] == 'O')
BFS(board, i, colNum - );
}
for(int i = ; i < rowNum; i++)
{
for(int j = ; j < colNum; 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 r, int c)
{
if(r >= && c >= && r < board.size() && c < board[].size() && board[r][c] == 'O')
{
board[r][c] = '+';
DFS(board, r - , c);
DFS(board, r + , c);
DFS(board, r, c - );
DFS(board, r, c + );
}
}
void BFS(vector<vector<char>> &board, int r, int c)
{
queue<pair<int, int>> q;
q.push(make_pair(r, c));
while(!q.empty())
{
int i = q.front().first;
int j = q.front().second;
q.pop();
if(i >= && j >= && i < board.size() && j < board[].size() && board[i][j] == 'O')
{
board[i][j] = '+';
q.push(make_pair(i - , j));
q.push(make_pair(i + , j));
q.push(make_pair(i, j - ));
q.push(make_pair(i, j + ));
}
}
}
上面的代码已经是优化过的了,我自己写的时候只写出了DFS的,而且自己也没有意识到是DFS。代码也很繁琐。注意通过把判断条件放在一起来简化代码。
我原本很挫的代码:栈溢出。
class Solution {
public:
void solve(vector<vector<char>> &board) {
if(board.size() == ) return;
int rowNum = board.size();
int colNum = board[].size();
//遍历最外面一圈,找‘O'
//最上
for(int j = ; j < colNum; j++)
{
if(board[][j] == 'O')
{
board[][j] = '+';
mySolve(board, , j);
}
}
//最下
for(int j = ; j < colNum; j++)
{
if(board[rowNum - ][j] == 'O')
{
board[rowNum - ][j] = '+';
mySolve(board, rowNum - , j);
}
}
//最左
for(int i = ; i < rowNum; i++)
{
if(board[i][] == 'O')
{
board[i][] = '+';
mySolve(board, i, );
}
}
//最右
for(int i = ; i < rowNum; i++)
{
if(board[i][colNum - ] == 'O')
{
board[i][colNum - ] = '+';
mySolve(board, i, colNum - );
}
}
for(int i = ; i < rowNum; i++)
{
for(int j = ; j < colNum; j++)
{
if(board[i][j] == 'O')
board[i][j] = 'X';
if(board[i][j] == '+')
board[i][j] = 'O';
}
}
}
void mySolve(vector<vector<char>> &board, int r, int c)
{
if(r - >= && board[r - ][c] == 'O') //上
{
board[r - ][c] == '+';
mySolve(board, r - , c);
}
if(r + < board.size() && board[r + ][c] == 'O') //下
{
board[r + ][c] == '+';
mySolve(board, r + , c);
}
if(c - >= && board[r][c - ] == 'O') //左
{
board[r][c - ] == '+';
mySolve(board, r, c - );
}
if(c + < board[].size() && board[r][c + ] == 'O') //下
{
board[r][c + ] == '+';
mySolve(board, r, c + );
}
}
};
【leetcode】Surrounded Regions(middle)☆的更多相关文章
- 【leetcode】Reverse Integer(middle)☆
Reverse digits of an integer. Example1: x = 123, return 321Example2: x = -123, return -321 总结:处理整数溢出 ...
- 【leetcode】Reorder List (middle)
Given a singly linked list L: L0→L1→…→Ln-1→Ln,reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→… You must do thi ...
- 【leetcode】Word Break (middle)
Given a string s and a dictionary of words dict, determine if s can be segmented into a space-separa ...
- 【leetcode】Rotate List(middle)
Given a list, rotate the list to the right by k places, where k is non-negative. For example:Given 1 ...
- 【leetcode】Partition List(middle)
Given a linked list and a value x, partition it such that all nodes less than x come before nodes gr ...
- 【leetcode】Spiral Matrix(middle)
Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral or ...
- 【leetcode】Rotate Image(middle)
You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees (clockwise). ...
- 【leetcode】Next Permutation(middle)
Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...
- 【leetcode】Reverse Bits(middle)
Reverse bits of a given 32 bits unsigned integer. For example, given input 43261596 (represented in ...
随机推荐
- seo是什么职业
SEO(Search Engine Optimization)汉译为搜索引擎优化.seo从业者首要工作就是优化网站,使其符合搜索引擎的基本规律和满足用户的需求,进而获得大量的用户访问.SEO职业属于一 ...
- C#5.0 特性
Visual Studio 2012 中 Visual C# 的新增功能 Lambda表达式 表达式树:把代码,转换成数据,然后分析数据发现其组成部分,最后转换成可以传递到其他程序的字符串 LinQ表 ...
- HDOJ 4717 The Moving Points
The Moving Points Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- CodeForces 55D Beautiful numbers
D. Beautiful numbers time limit per test 4 seconds memory limit per test 256 megabytes input standar ...
- PHP魔术方法以及关于独立实例与相连实例的讲解
<?php //魔术方法 //当包含多个类 //1.自动装载类的魔术方法__autoload() function __autoload($classname){ if (isset($clas ...
- jquery获取文本框的内容
使用jquery获取文本框的内容有以下几种: 1.根据ID取值(id属性): // javascript <script type="text/javascript"> ...
- 使用PHP的五个小技巧
PHP的一些小技巧,比较基础,总结一下,老鸟换个姿势飘过去就是. 1. str_replace str_replace是非常常常常常用的php函数,用于字符串替换,经常看到某些php新人为了替换一批字 ...
- String类replaceAll方法正则替换深入分析
作者网址: https://my.oschina.net/shipley/blog/98973 背景: 前几天有人发了一个关于下面问题的贴,对这个有点好奇,故花时间做了点研究. ...
- C++中的内联成员函数与非内联成员函数
在C++中内联成员函数与非内联成员函数的可以分为两种情况: 1.如果成员函数的声明和定义是在一起的,那么无论有没有写inline这个成员函数都是内联的,如下: using namespace std; ...
- FineUI第十一天---布局概述
布局概述 1.填充整个页面: 让整个容器填充整个页面,设置PageManager的AutoSizePanelID为需要填充整个页面的容器控件ID. 2. 填充整个容器(Fit): 让一个控件填满另一个 ...