Redian新闻
>
请教一道著名CS面试题:最大黑边正方形
avatar
请教一道著名CS面试题:最大黑边正方形# JobHunting - 待字闺中
b*a
1
N×N矩阵,每个CELL或黑或白,要求找出最大正方形,边全部是黑的
感觉是Dynamic Programming, 但正方形似乎与矩形完全不同,请教正确答案,谢谢!
avatar
g*s
2
a(x,y) 表示到(x,y)的最长水平黑边 O(n*n)
b(x,y) 表示到(x,y)的最长竖直黑边 O(n*n)
c(x,y) 表示(x,y)为右上角的最大黑色正方形的边长。
c(x,y) = min ( a(x,y), b(x,y), c(x-1,y-1)+1) O(n*n)
所以,空间和时间复杂度都是O(n×n)

【在 b*******a 的大作中提到】
: N×N矩阵,每个CELL或黑或白,要求找出最大正方形,边全部是黑的
: 感觉是Dynamic Programming, 但正方形似乎与矩形完全不同,请教正确答案,谢谢!

avatar
g*s
3
如果是黑边白芯呢?

【在 g***s 的大作中提到】
: a(x,y) 表示到(x,y)的最长水平黑边 O(n*n)
: b(x,y) 表示到(x,y)的最长竖直黑边 O(n*n)
: c(x,y) 表示(x,y)为右上角的最大黑色正方形的边长。
: c(x,y) = min ( a(x,y), b(x,y), c(x-1,y-1)+1) O(n*n)
: 所以,空间和时间复杂度都是O(n×n)

avatar
b*n
4
怎么看着是 O(n^3)

谢!

【在 g***s 的大作中提到】
: a(x,y) 表示到(x,y)的最长水平黑边 O(n*n)
: b(x,y) 表示到(x,y)的最长竖直黑边 O(n*n)
: c(x,y) 表示(x,y)为右上角的最大黑色正方形的边长。
: c(x,y) = min ( a(x,y), b(x,y), c(x-1,y-1)+1) O(n*n)
: 所以,空间和时间复杂度都是O(n×n)

avatar
j*x
5
公式是错的
这个貌似只适用于求“全部是黑色”的正方形

【在 g***s 的大作中提到】
: a(x,y) 表示到(x,y)的最长水平黑边 O(n*n)
: b(x,y) 表示到(x,y)的最长竖直黑边 O(n*n)
: c(x,y) 表示(x,y)为右上角的最大黑色正方形的边长。
: c(x,y) = min ( a(x,y), b(x,y), c(x-1,y-1)+1) O(n*n)
: 所以,空间和时间复杂度都是O(n×n)

avatar
g*s
6
Sorry, my mistake. Didn't read the question carefully.
So, we need to change a little:
c(x,y) = max t,
0 <=t <= min ( a[x,y], b[x,y] ]
b(x-t+1,y) >= t && a(x, y-t+1) >= t
this step needs O(n). So total time is O(n^3) and space is O(n^2).

【在 g*********s 的大作中提到】
: 如果是黑边白芯呢?
avatar
l*y
7
Could you please elaborate the solution?
Thanks a lot!

【在 g***s 的大作中提到】
: Sorry, my mistake. Didn't read the question carefully.
: So, we need to change a little:
: c(x,y) = max t,
: 0 <=t <= min ( a[x,y], b[x,y] ]
: b(x-t+1,y) >= t && a(x, y-t+1) >= t
: this step needs O(n). So total time is O(n^3) and space is O(n^2).

avatar
c*0
8
My solution:
我们首先第一次循环 一列一列的 找到每一列的所有的连续黑边 每一个黑边用一个坐
标 (x,y)和垂直长度 l 表示
之后一行一行的循环 找到每一行所有连续的黑边 每个黑边用(x,y)加水平长度l表示
之后对每个竖向的黑边 check 存不存在对应的一个竖向的黑边和两个水平的黑边,这
个check应该是很快的 O(1)或者O(lgn) 取决于怎么存连续黑边
这样是不是O(n^2)的复杂度?
avatar
g*s
9
0 <=t <= a[x,y] 这个保证上边是黑的
0 <=t <= b[x,y] 这个保证右边是黑的
b(x-t+1,y) >= t 这个保证左边是黑的
a(x, y-t+1)>= t 这个保证下边是黑的
W W B B B B
W B B B W B
W W B W W B
B B B B B B
W W W W W B
W W W W W W
give a sample,
c(6,6) = 4
a(6,6) = 4
b(6,6) = 5
b(3,6) = 4 >=4
a(6,3) = 6 >=4

【在 l*********y 的大作中提到】
: Could you please elaborate the solution?
: Thanks a lot!

avatar
g*s
10

~~~this is not easy to get in O(1) or O(lgn).
sample: all (1,y) = B, all (2, even number) = B
now, there are O(n) 水平边.
B
BB
B
BB
B
BB
B
BB
B

【在 c********0 的大作中提到】
: My solution:
: 我们首先第一次循环 一列一列的 找到每一列的所有的连续黑边 每一个黑边用一个坐
: 标 (x,y)和垂直长度 l 表示
: 之后一行一行的循环 找到每一行所有连续的黑边 每个黑边用(x,y)加水平长度l表示
: 之后对每个竖向的黑边 check 存不存在对应的一个竖向的黑边和两个水平的黑边,这
: 个check应该是很快的 O(1)或者O(lgn) 取决于怎么存连续黑边
: 这样是不是O(n^2)的复杂度?

avatar
g*k
11
这些个变量都是什么?
神马叫做 到(x,y)的最长黑边?
即便是求黑方块,这也是错的。

【在 g***s 的大作中提到】
: a(x,y) 表示到(x,y)的最长水平黑边 O(n*n)
: b(x,y) 表示到(x,y)的最长竖直黑边 O(n*n)
: c(x,y) 表示(x,y)为右上角的最大黑色正方形的边长。
: c(x,y) = min ( a(x,y), b(x,y), c(x-1,y-1)+1) O(n*n)
: 所以,空间和时间复杂度都是O(n×n)

avatar
g*s
12
你没看懂得话怎么看出是错的?

【在 g*****k 的大作中提到】
: 这些个变量都是什么?
: 神马叫做 到(x,y)的最长黑边?
: 即便是求黑方块,这也是错的。

avatar
r*h
13
very nice

【在 g***s 的大作中提到】
: 0 <=t <= a[x,y] 这个保证上边是黑的
: 0 <=t <= b[x,y] 这个保证右边是黑的
: b(x-t+1,y) >= t 这个保证左边是黑的
: a(x, y-t+1)>= t 这个保证下边是黑的
: W W B B B B
: W B B B W B
: W W B W W B
: B B B B B B
: W W W W W B
: W W W W W W

avatar
U*R
14
I like this solution!

【在 g***s 的大作中提到】
: 0 <=t <= a[x,y] 这个保证上边是黑的
: 0 <=t <= b[x,y] 这个保证右边是黑的
: b(x-t+1,y) >= t 这个保证左边是黑的
: a(x, y-t+1)>= t 这个保证下边是黑的
: W W B B B B
: W B B B W B
: W W B W W B
: B B B B B B
: W W W W W B
: W W W W W W

avatar
b*a
15
Thanks! This solution looks right.

【在 g***s 的大作中提到】
: a(x,y) 表示到(x,y)的最长水平黑边 O(n*n)
: b(x,y) 表示到(x,y)的最长竖直黑边 O(n*n)
: c(x,y) 表示(x,y)为右上角的最大黑色正方形的边长。
: c(x,y) = min ( a(x,y), b(x,y), c(x-1,y-1)+1) O(n*n)
: 所以,空间和时间复杂度都是O(n×n)

avatar
e*e
16
如果这题目变变,变成长方形,黑边就可以了。。
求最大(周长最大比如)咋办?
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。