【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 ...
随机推荐
- Linq to sql 的语法
Linq to SQL 语法查询(子查询 & in操作 & join ) 引用地址:http://www.cnblogs.com/82767136/articles/2949541.h ...
- IBM:领导力素质的三环模式
文章来源:http://blog.vsharing.com/sdtcj/A1826934.html 在翰威特公司于2003年评选的美国企业“领导人才最佳雇主”名单上,IBM名列榜首.而纽约< ...
- 第2月第3天 egorefresh
egorefresh是很老的下拉刷新,它是一个uiview,在uitableview 下拉的时候显示不同的界面. egorefresh和uitableview的耦合度很高,uitableview滚动和 ...
- linux 脚本命令匹配并获取下一行数据
三种方式: 匹配“Title”并打印出匹配行的下一行 grep -A 1 'Title' urfile awk '/Title/{getline a;print $0"\n"a ...
- js读取修改创建txt文本类型文件(.ini)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Pragma如何分组
Pragma Pragma Mark #pragma mark - 是一个在类内部组织代码并且帮助你分组方法实现的好办法. 我们建议使用 #pragma mark - 来分离: 不同功能组的方法 pr ...
- ios 异常捕获
@try { @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate c ...
- leetcode 33. Search in Rotated Sorted Array
Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 migh ...
- class training
实验3-1 分别使用while循环.do while循环.for循环求 (即求1+2+3+ --+100). 参考: 源码 方法一#include<stdio.h> int main(){ ...
- Hashtable和HashMap类的区别
Hashtable和HashMap类有三个重要的不同之处.第一个不同主要是历史原因.Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现. ...