由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - Surrounded Regions
相关主题
大家帮我看看这段code 哪儿错了问一个C++ set和unordered_set iterator的问题
请教一道G题的代码量LC Longest substr w/o rep char
Surrounded Regions, dfs solution. 过不了online test请教一下,leetcode surrounded regions这题为什么我的代码会超时
问leetcode上surrounded regions,新的test case出runtime error弱问OJ的Surrounded Regions那题
Leetcode Surrounded Regions Large Case Runtime Errorleetcode上的大oj和小oj有什么本质差别吗?
Leetcode 的 Surrounded Regions 好难过大OJ (in JAVA)Leetcode上Two sum只能过3个case, VS能过,大牛进来看看是怎么回事
leetcode 3sum c++解法超时leetcode出了新题word ladder
T家电面面经并且不解为何被秒拒请问下leetcode的two sum题目
相关话题的讨论汇总
话题: int话题: board话题: jj话题: ii话题: fill
进入JobHunting版参与讨论
1 (共1页)
h***i
发帖数: 1970
1
O(n*n)怎么也过不了large test?
void solve(vector> &board) {
int m = board.size();
if (m == 0) return;
int n = board[0].size();
unordered_set checked;
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
if (board[i][j] == 'X') continue;
if (checked.find(i * n + j) != checked.end()) continue;
unordered_set s;
queue q;
s.insert(i * n + j);
q.push(i * n + j);
bool fill = true;
while (!q.empty()) {
int k = q.front();
q.pop();
int jj = k % n;
int ii = k / n;
checked.insert(ii * n + jj);
if (ii == 0 || ii == m - 1 || jj == 0 || jj == n - 1)
fill = false;
if (ii + 1 < m && board[ii+1][jj] == 'O') {
s.insert((ii + 1) * n + jj);
q.push((ii + 1) * n + jj);
}
if (jj + 1 < n && board[ii][jj+1] == 'O') {
s.insert(ii* n + jj + 1);
q.push(ii * n + jj + 1);
}
}
if (fill) {
for (unordered_set::iterator it = s.begin();
it != s.end(); ++it) {
int k = *it;
int jj = k % n;
int ii = k / n;
board[ii][jj] = 'X';
}
}
}
}

}
p*****2
发帖数: 21240
2
系统不稳定。我这个dfs也是要run很多次才能过一次。不过我两个都实现了。
http://blog.sina.com.cn/s/blog_b9285de20101j1dt.html
p****e
发帖数: 3548
3
我的也不行,怎么检查代码都出错,小数据没问题
f*******t
发帖数: 7549
4
什么错?

【在 p****e 的大作中提到】
: 我的也不行,怎么检查代码都出错,小数据没问题
l***i
发帖数: 1309
5
judge does not like dfs, seems recursion depth is huge. Use bfs should work.
My code for reference:
class Solution {
public:
void dfs(char marker, int r, int c, vector > &board)
{
board[r][c] = marker;
int n = board.size(), m = board[0].size();
int d[][2] = {{-1,0}, {0,+1}, {+1,0}, {0,-1}};
queue > que;
que.push(make_pair(r,c));
while (!que.empty()) {
pair p = que.front(); que.pop();
int i = p.first, j = p.second;
for (int x = 0; x < 4; ++x) {
int i2, j2;
i2 = i + d[x][0]; j2 = j + d[x][1];
if (0 <= i2 && i2 < n && 0 <= j2 && j2 < m
&& board[i2][j2] == 'O') {
board[i2][j2] = marker; que.push(make_pair(i2,j2));
}
}
}
// judge does not like dfs
/*
for (int x=0; x<4; ++x) {
int i = r + d[x][0];
int j = c + d[x][1];
if (0 <= i && i < n && 0 <= j && j < m && board[i][j] == 'O') {
dfs(marker, i, j, board);
}
} */
}

void solve(vector> &board) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if (board.empty()) return;
// start from border, mark all O, then set all other O to X
int n = board.size(), m = board[0].size();
const char marker = 'T';
for (int j=0; j int i;
i = 0; if (board[i][j] == 'O') dfs(marker, i, j, board);
i = n-1; if (board[i][j] == 'O') dfs(marker, i, j, board);
}
for (int i=0; i int j;
j = 0; if (board[i][j] == 'O') dfs(marker, i, j, board);
j = m-1; if (board[i][j] == 'O') dfs(marker, i, j, board);
}
for (int i=0; i for (int j=0; j if (board[i][j] == marker) board[i][j] = 'O';
else if (board[i][j] == 'O') board[i][j] = 'X';
}
};
p*****2
发帖数: 21240
6

work.
LZ的不是dfs吧?我倒是在你的code里边看到dfs了。

【在 l***i 的大作中提到】
: judge does not like dfs, seems recursion depth is huge. Use bfs should work.
: My code for reference:
: class Solution {
: public:
: void dfs(char marker, int r, int c, vector > &board)
: {
: board[r][c] = marker;
: int n = board.size(), m = board[0].size();
: int d[][2] = {{-1,0}, {0,+1}, {+1,0}, {0,-1}};
: queue > que;

h***i
发帖数: 1970
7
你的这个从四边往中间走的思路好,什么都不用记了。

【在 p*****2 的大作中提到】
:
: work.
: LZ的不是dfs吧?我倒是在你的code里边看到dfs了。

h***i
发帖数: 1970
8
贴个旁门左道。 88 milli secs过large test.
typedef struct FU {
int parent;
bool fill;
int rank;
FU(int v, bool f)
: parent(v),
fill(f),
rank(0) {
}
} FU;

int find(int i, vector &v) {
if (v[i].parent == i) return i;
v[i].parent = find(v[i].parent, v);
return v[i].parent;
}

void union_by_rank(int i, int j, vector &v) {
int k = find(i, v);
int l = find(j, v);
if (k == l) return;
if (v[k].rank < v[l].rank) {
v[k].parent = l;
if (v[k].fill == false) v[l].fill = false;
}
else if (v[k].rank > v[l].rank) {
v[l].parent = k;
if (v[l].fill == false) v[k].fill = false;
}
else {
v[l].parent = k;
v[k].rank += 1;
if (v[l].fill == false) v[k].fill = false;
}

}

void solve(vector> &board) {
int m = board.size();
if (m == 0) return;
int n = board[0].size();
vector v;
for (int i = 0; i < m; ++i)
for (int j = 0; j < n; ++j)
v.push_back(FU(i * n + j, true));
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
if (board[i][j] == 'X') continue;
int index = i * n + j;
if (i + 1 < m && board[i + 1][j] == 'O')
union_by_rank(index + n, index, v);
if (j + 1 < n && board[i][j + 1] == 'O')
union_by_rank(index, index + 1, v);
if (i == 0 || i == m - 1 || j == 0 || j == n - 1) {
int l = find(index, v);
v[l].fill = false;
}
}
}

for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
if (board[i][j] == 'X') continue;
int l = find(i * n + j, v);
if (v[l].fill)
board[i][j] = 'X';
}
}
}

【在 h***i 的大作中提到】
: 你的这个从四边往中间走的思路好,什么都不用记了。
w****a
发帖数: 710
9
其实可以用01稀疏矩阵里找连续的的1的方法。贴个我的代码。注意因为输入的是char
类型的矩阵,所以这个只能过小集合。简单改一下用int矩阵存起来就能过大集合了。
时间复杂度O(m*n)
class Solution {
public:
void solve(vector> &board) {

int m = board.size();
if(m <= 1) return;
int n = board[0].size();
if(n <= 1) return;

char count = 0;
for(int i = 0; i < m; i++)
for(int j = 0; j < n; j++)
if(board[i][j] == 'O')
board[i][j] = ++count;

set margins;

for(int i = 0; i < m; i++)
for(int j = 0; j < n; j++)
if(board[i][j] != 'X'){
if(i!=0 && board[i-1][j] != 'X')
board[i][j] = board[i-1][j];
else if(j!=0 && board[i][j-1] != 'X')
board[i][j] = board[i][j-1];

if(i==0 || i==m-1 || j==0 || j==n-1)
margins.insert(board[i][j]);
}

for(int i = 0; i < m; i++)
for(int j = 0; j < n; j++)
if(board[i][j] != 'X')
if(margins.find(board[i][j])!=margins.end())
board[i][j] = 'O';
else
board[i][j] = 'X';

}
};
l***i
发帖数: 1309
10
比较懒,dfs改成了bfs,不过function还是叫dfs
我觉得自己用stack做nonrecursive的dfs也能过,不过没试

【在 p*****2 的大作中提到】
:
: work.
: LZ的不是dfs吧?我倒是在你的code里边看到dfs了。

p*****2
发帖数: 21240
11

应该能过。

【在 l***i 的大作中提到】
: 比较懒,dfs改成了bfs,不过function还是叫dfs
: 我觉得自己用stack做nonrecursive的dfs也能过,不过没试

1 (共1页)
进入JobHunting版参与讨论
相关主题
请问下leetcode的two sum题目Leetcode Surrounded Regions Large Case Runtime Error
leetcode的Longest Substring Without Repeating Characters解法好麻烦啊Leetcode 的 Surrounded Regions 好难过大OJ (in JAVA)
G家电面leetcode 3sum c++解法超时
帮俺看一下代码DP+DFS为什么过不了work break II 那个大case : aaaaaaa...T家电面面经并且不解为何被秒拒
大家帮我看看这段code 哪儿错了问一个C++ set和unordered_set iterator的问题
请教一道G题的代码量LC Longest substr w/o rep char
Surrounded Regions, dfs solution. 过不了online test请教一下,leetcode surrounded regions这题为什么我的代码会超时
问leetcode上surrounded regions,新的test case出runtime error弱问OJ的Surrounded Regions那题
相关话题的讨论汇总
话题: int话题: board话题: jj话题: ii话题: fill