s*********g 发帖数: 849 | 1 Given a 2d array, find the the shape count.就是有1的连续片段的数目。脑袋木了
, collabedit上写了一团乱麻。老爸在旁边切菜,别interviewer叫停了。。。
e.g 1
[
[101]
[010]
[111]
]
count = 3
e.g 2
[
[111]
[001]
[111]
]
count = 1
e.g 3
[
[111111111111]
[000000000001]
[111000000001]
[100000100001]
[100000000001]
[100000000001]
[111111111111]
]
count = 2 |
y***n 发帖数: 1594 | |
l*****a 发帖数: 14598 | 3 A电面考这个算难题了吧
【在 s*********g 的大作中提到】 : Given a 2d array, find the the shape count.就是有1的连续片段的数目。脑袋木了 : , collabedit上写了一团乱麻。老爸在旁边切菜,别interviewer叫停了。。。 : e.g 1 : [ : [101] : [010] : [111] : ] : count = 3 : e.g 2
|
s*********g 发帖数: 849 | 4 如果只需要说用DFS,不用写代码,我就过了。。。。 |
s*********g 发帖数: 849 | 5 一面电面,搞这种题我认跪了,反正也办不了GC,兴趣不大。自己找虐罢了。。
【在 l*****a 的大作中提到】 : A电面考这个算难题了吧
|
y***n 发帖数: 1594 | |
s*********g 发帖数: 849 | |
y***n 发帖数: 1594 | 8 不过少了一个模拟考的机会,也挺可惜的。
A作为高考前的模拟考试其实蛮好的。 |
M**a 发帖数: 848 | |
s*********g 发帖数: 849 | 10 确实。面A的目的也就是这个。
【在 y***n 的大作中提到】 : 不过少了一个模拟考的机会,也挺可惜的。 : A作为高考前的模拟考试其实蛮好的。
|
|
|
s*********g 发帖数: 849 | 11 横竖连起来的1
【在 M**a 的大作中提到】 : 没看懂。
|
a**********0 发帖数: 422 | 12 为什么切菜 给你加油助威还是威胁interviewer 你父亲新疆来的? |
a**********0 发帖数: 422 | 13 为什么一定要用DFS 不是类似surrounded reigions 吗 可以用 BFS
只不过要设一个variable用于记录cluster的数目
而且BFS过后的要label一下表示不能继续使用 我试着贴一下代码
private void bfs(char[][] board, int i, int j) {
int row = board.length;
int col = board[0].length;
ArrayList queue = new ArrayList();
queue.add(i * col + j);
board[i][j] = 'P';
while (!queue.isEmpty()) {
int cur = queue.get(0);
queue.remove(0);
int x = cur / col;
int y = cur % col;
if (x-1 < 0 || x-1 >= row || y < 0 || y >= col || board[x-1][y] != '
1')
;
else{
queue.add((x-1) * col + y);
board[x-1][y] = 'P';
}
if (x+1 < 0 || x+1 >= row || y < 0 || y >= col || board[x+1][y] != '
1')
;
else{
queue.add((x+1) * col + y);
board[x+1][y] = 'P';
}
if (x < 0 || x >= row || y-1 < 0 || y-1 >= col || board[x][y-1] != '
1')
;
else{
queue.add((x) * col + y-1);
board[x][y-1] = 'P';
}
if (x < 0 || x >= row || y+1 < 0 || y+1 >= col || board[x][y+1] !=
'1')
;
else{ queue.add((x) * col + y+1);
board[x][y+1] = 'P';
}
}
this. count ++ // for the result
}
然后扫描每个点of the board 如果 是1 就调用bfs函数 访问过的1就变成P了 这
样就不会重复计数了
count是 class的一个field
|
s******s 发帖数: 84 | 14 搞siao~
【在 a**********0 的大作中提到】 : 为什么切菜 给你加油助威还是威胁interviewer 你父亲新疆来的?
|
a**********0 发帖数: 422 | 15 dfs类似 就是扫描matrix的每个点 如果是1 this.count就加一
然后dfs起得作用是label从这点延伸出去的同一个cluster的所有1都变成p 防止重复
dfs拓展需要考虑上下左右和是否是1 如果不是 也没有必要dfs下去了
但是如果是leetcode 可能dfs oj无法通过 不就是 surrounded 区域面积吗
当然最后破坏了数据结构
如果喜欢 可以再一次扫描 把P都变回来1 |
t**r 发帖数: 3428 | 16 # In this solution as soon as we find a 1, we replace
# all the elements in the shape with 2 to avoid double
# counting the 1s. Otherwise, it's simple iteration.
def count_shapes(m):
num_shapes = 0
for r in range(len(m)):
for c in range(len(m[0])):
if m[r][c] == 1:
fill_shape_with_twos(m, r, c)
num_shapes += 1
# restore the original values
for r in range(len(m)):
for c in range(len(m[0])):
m[r][c] = m[r][c] / 2
return num_shapes
def fill_shape_with_twos(m, r, c):
m[r][c] = 2
if r > 0 and m[r-1][c] == 1:
fill_shape_with_twos(m, r-1, c)
if r + 1 < len(m) and m[r+1][c] == 1:
fill_shape_with_twos(m, r+1, c)
if c > 0 and m[r][c-1] == 1:
fill_shape_with_twos(m, r, c-1)
if c + 1 < len(m[0]) and m[r][c+1] == 1:
fill_shape_with_twos(m, r, c+1) |
y***n 发帖数: 1594 | 17 我写了一个C++ 的。
http://ideone.com/GE3w1N
一下子写对也不容易。 |
t**r 发帖数: 3428 | 18 nice solution
【在 y***n 的大作中提到】 : 我写了一个C++ 的。 : http://ideone.com/GE3w1N : 一下子写对也不容易。
|
y***n 发帖数: 1594 | 19 其实就是求图有多少个Connected Components. |
c*******y 发帖数: 98 | 20 看半天才看明白啥意思。。。shape count。。。说白了就是下围棋填满子以后算你有
几块棋被分断了。会画图里的填充算法就行了。弄个stack再弄个image temp buffer就
能做了。 |
|
|
s*********g 发帖数: 849 | 21 Given a 2d array, find the the shape count.就是有1的连续片段的数目。脑袋木了
, collabedit上写了一团乱麻。老爸在旁边切菜,别interviewer叫停了。。。
e.g 1
[
[101]
[010]
[111]
]
count = 3
e.g 2
[
[111]
[001]
[111]
]
count = 1
e.g 3
[
[111111111111]
[000000000001]
[111000000001]
[100000100001]
[100000000001]
[100000000001]
[111111111111]
]
count = 2 |
y***n 发帖数: 1594 | |
s*********g 发帖数: 849 | 23 如果只需要说用DFS,不用写代码,我就过了。。。。 |
s*********g 发帖数: 849 | 24 一面电面,搞这种题我认跪了,反正也办不了GC,兴趣不大。自己找虐罢了。。
【在 l*****a 的大作中提到】 : A电面考这个算难题了吧
|
y***n 发帖数: 1594 | |
s*********g 发帖数: 849 | |
y***n 发帖数: 1594 | 27 不过少了一个模拟考的机会,也挺可惜的。
A作为高考前的模拟考试其实蛮好的。 |
M**a 发帖数: 848 | |
s*********g 发帖数: 849 | 29 确实。面A的目的也就是这个。
【在 y***n 的大作中提到】 : 不过少了一个模拟考的机会,也挺可惜的。 : A作为高考前的模拟考试其实蛮好的。
|
s*********g 发帖数: 849 | 30 横竖连起来的1
【在 M**a 的大作中提到】 : 没看懂。
|
|
|
a**********0 发帖数: 422 | 31 为什么切菜 给你加油助威还是威胁interviewer 你父亲新疆来的? |
a**********0 发帖数: 422 | 32 为什么一定要用DFS 不是类似surrounded reigions 吗 可以用 BFS
只不过要设一个variable用于记录cluster的数目
而且BFS过后的要label一下表示不能继续使用 我试着贴一下代码
private void bfs(char[][] board, int i, int j) {
int row = board.length;
int col = board[0].length;
ArrayList queue = new ArrayList();
queue.add(i * col + j);
board[i][j] = 'P';
while (!queue.isEmpty()) {
int cur = queue.get(0);
queue.remove(0);
int x = cur / col;
int y = cur % col;
if (x-1 < 0 || x-1 >= row || y < 0 || y >= col || board[x-1][y] != '
1')
;
else{
queue.add((x-1) * col + y);
board[x-1][y] = 'P';
}
if (x+1 < 0 || x+1 >= row || y < 0 || y >= col || board[x+1][y] != '
1')
;
else{
queue.add((x+1) * col + y);
board[x+1][y] = 'P';
}
if (x < 0 || x >= row || y-1 < 0 || y-1 >= col || board[x][y-1] != '
1')
;
else{
queue.add((x) * col + y-1);
board[x][y-1] = 'P';
}
if (x < 0 || x >= row || y+1 < 0 || y+1 >= col || board[x][y+1] !=
'1')
;
else{ queue.add((x) * col + y+1);
board[x][y+1] = 'P';
}
}
this. count ++ // for the result
}
然后扫描每个点of the board 如果 是1 就调用bfs函数 访问过的1就变成P了 这
样就不会重复计数了
count是 class的一个field
|
a**********0 发帖数: 422 | 33 dfs类似 就是扫描matrix的每个点 如果是1 this.count就加一
然后dfs起得作用是label从这点延伸出去的同一个cluster的所有1都变成p 防止重复
dfs拓展需要考虑上下左右和是否是1 如果不是 也没有必要dfs下去了
但是如果是leetcode 可能dfs oj无法通过 不就是 surrounded 区域面积吗
当然最后破坏了数据结构
如果喜欢 可以再一次扫描 把P都变回来1 |
t**r 发帖数: 3428 | 34 # In this solution as soon as we find a 1, we replace
# all the elements in the shape with 2 to avoid double
# counting the 1s. Otherwise, it's simple iteration.
def count_shapes(m):
num_shapes = 0
for r in range(len(m)):
for c in range(len(m[0])):
if m[r][c] == 1:
fill_shape_with_twos(m, r, c)
num_shapes += 1
# restore the original values
for r in range(len(m)):
for c in range(len(m[0])):
m[r][c] = m[r][c] / 2
return num_shapes
def fill_shape_with_twos(m, r, c):
m[r][c] = 2
if r > 0 and m[r-1][c] == 1:
fill_shape_with_twos(m, r-1, c)
if r + 1 < len(m) and m[r+1][c] == 1:
fill_shape_with_twos(m, r+1, c)
if c > 0 and m[r][c-1] == 1:
fill_shape_with_twos(m, r, c-1)
if c + 1 < len(m[0]) and m[r][c+1] == 1:
fill_shape_with_twos(m, r, c+1) |
y***n 发帖数: 1594 | 35 我写了一个C++ 的。
http://ideone.com/GE3w1N
一下子写对也不容易。 |
t**r 发帖数: 3428 | 36 nice solution
【在 y***n 的大作中提到】 : 我写了一个C++ 的。 : http://ideone.com/GE3w1N : 一下子写对也不容易。
|
y***n 发帖数: 1594 | 37 其实就是求图有多少个Connected Components. |
c*******y 发帖数: 98 | 38 看半天才看明白啥意思。。。shape count。。。说白了就是下围棋填满子以后算你有
几块棋被分断了。会画图里的填充算法就行了。弄个stack再弄个image temp buffer就
能做了。 |
n******n 发帖数: 602 | 39 这题我被面过。可以O(N)做出来。就是一行行扫描,基本思想就是count 有多少
disconnected shape, 如果发现两个Disconnected shape又连起来了,count --就好。
【在 c*******y 的大作中提到】 : 看半天才看明白啥意思。。。shape count。。。说白了就是下围棋填满子以后算你有 : 几块棋被分断了。会画图里的填充算法就行了。弄个stack再弄个image temp buffer就 : 能做了。
|
u****p 发帖数: 526 | |
|
|
m******u 发帖数: 18 | |
u***n 发帖数: 21026 | 42 smart啊
【在 n******n 的大作中提到】 : 这题我被面过。可以O(N)做出来。就是一行行扫描,基本思想就是count 有多少 : disconnected shape, 如果发现两个Disconnected shape又连起来了,count --就好。
|
l****7 发帖数: 133 | |
r*******y 发帖数: 270 | 44 这题目标是O(n) time, O(1)的space。如果写的DFS是O(n)space过不过也很难说 |
t**c 发帖数: 480 | 45 这道题dfs可以做到 ontime o1space
把遇到的X都变成O
每个点最多扫描一次
计算count
实际上速度很快,貌似比union find 快
【在 r*******y 的大作中提到】 : 这题目标是O(n) time, O(1)的space。如果写的DFS是O(n)space过不过也很难说
|