Redian新闻
>
版上有三月以后递交了485到TSC, 并且已经收到FP notice的吗?
avatar
W*y
2
你们大概等了多久?
avatar
f*s
3
难道不是和一维类似吗?
先每一行从左到又扫,再从右到左扫。得到两个矩阵
然后每一列从上到下扫,再从下到上扫,得到两个矩阵。
然后扫一遍矩阵。
avatar
c*d
4
有人2月底交,4月初FP
avatar
T*i
6
大概24天收到notice

【在 W**********y 的大作中提到】
: 你们大概等了多久?
avatar
p*2
7

你是每个cell只考虑四个方向吗?

【在 f****s 的大作中提到】
: 难道不是和一维类似吗?
: 先每一行从左到又扫,再从右到左扫。得到两个矩阵
: 然后每一列从上到下扫,再从下到上扫,得到两个矩阵。
: 然后扫一遍矩阵。

avatar
e*g
8
485 RD 3/13,
收到FP notice 4/7
25天

【在 W**********y 的大作中提到】
: 你们大概等了多久?
avatar
l*b
9
这个肯定不对吧。
我的考虑是从最外一圈开始扫描,存一个used的map,然后在扫描的结果里面取最小值
,如果没有就随便取一个,然后从那个点开始做4向的DFS或者BSF,如果这个点的值小
于当前的值,求差,存近result里面,然后在used map里面mark这个点。如果这个点的
值大于当前的值,标记一下这个点,用于下一轮求最小值,因为这个是一个新的border
了。
一直重复这个知道所有的点都在used map里面mark了。
好像很复杂的样子。。。

【在 p*****2 的大作中提到】
:
: 你是每个cell只考虑四个方向吗?

avatar
p*2
10

border
我也觉得不行。我的想法是用两个数据结构
1. visited matrix 表明已经用过的cell
2. PriorityQueue放目前的边界
PQ总是弹出最低的cell。得到最低的cell以后找没有访问过的邻居。如果邻居小的话,
就可以装水了。把邻居放入PQ中作为新的边界。
这样一直到PQ为空。复杂度N*N*logN, 程序貌似不是很复杂。

【在 l**b 的大作中提到】
: 这个肯定不对吧。
: 我的考虑是从最外一圈开始扫描,存一个used的map,然后在扫描的结果里面取最小值
: ,如果没有就随便取一个,然后从那个点开始做4向的DFS或者BSF,如果这个点的值小
: 于当前的值,求差,存近result里面,然后在used map里面mark这个点。如果这个点的
: 值大于当前的值,标记一下这个点,用于下一轮求最小值,因为这个是一个新的border
: 了。
: 一直重复这个知道所有的点都在used map里面mark了。
: 好像很复杂的样子。。。

avatar
c*t
12
你写的太简洁了,佩服。原来真的不用刻意删除PQ里的元素啊。
我想的是visited的应该从pq里删除。又想pq删除效率不高,就改用hashmap.还得每次
遍历找map里的最小值。真是越走越偏啊。比你复杂好多。但你觉得效率是不是高些?
BTW, welcome back to java!

【在 p*****2 的大作中提到】
: 写了一个。大家看看如果没什么问题。放到我的博客里去。
: http://blog.sina.com.cn/s/blog_b9285de20101j9a7.html

avatar
f*s
13
我错了,大家鄙视我吧,学习去了。
avatar
c*t
14
二爷,我和你的codes还有一个区别
你的check只查一个点,然后放入min heap. 我考虑的是,如果check的点比curr min小
,肯定就是new min,所以直接从它继续check. 只有比curr min大的点才入heap.所以我
是直接把dfs写到check里了。你觉得是不是效率高一点?

【在 p*****2 的大作中提到】
: 写了一个。大家看看如果没什么问题。放到我的博客里去。
: http://blog.sina.com.cn/s/blog_b9285de20101j9a7.html

avatar
p*2
15

应该没什么大区别吧。只是你这个就不需要enqueue,一直小的情况应该并不多见,代
码会复杂一些吧?

【在 c********t 的大作中提到】
: 二爷,我和你的codes还有一个区别
: 你的check只查一个点,然后放入min heap. 我考虑的是,如果check的点比curr min小
: ,肯定就是new min,所以直接从它继续check. 只有比curr min大的点才入heap.所以我
: 是直接把dfs写到check里了。你觉得是不是效率高一点?

avatar
c*t
16
嗯,那在check method里,visited过得直接从min heap里去掉,有没有效率提升?(
见我上上帖子)

【在 p*****2 的大作中提到】
:
: 应该没什么大区别吧。只是你这个就不需要enqueue,一直小的情况应该并不多见,代
: 码会复杂一些吧?

avatar
p*2
17

应该没有什么大关系吧?

【在 c********t 的大作中提到】
: 嗯,那在check method里,visited过得直接从min heap里去掉,有没有效率提升?(
: 见我上上帖子)

avatar
p*2
18

想知道你怎么这么扣性能呀?
一般来说面试性能的提升主要是复杂度的改善,比赛的时候只要时间规定之内能过就行
,不用扣的很死。一般写代码之前能算个大概。

【在 c********t 的大作中提到】
: 嗯,那在check method里,visited过得直接从min heap里去掉,有没有效率提升?(
: 见我上上帖子)

avatar
c*t
19
你说得对,我有点走火入魔了。

★ 发自iPhone App: ChineseWeb 7.8

【在 p*****2 的大作中提到】
:
: 想知道你怎么这么扣性能呀?
: 一般来说面试性能的提升主要是复杂度的改善,比赛的时候只要时间规定之内能过就行
: ,不用扣的很死。一般写代码之前能算个大概。

avatar
f*w
20
我有个疑问, 假设如下的情况
3 3 3 3
3 0 0 3
3 1 3 3
第一次从queue里面弹出的是1, 找邻居的话会加入0进入队列。然后更新count = 1 -
0 = 1
但是在循环的时候会弹出0,邻居还是0, 此时程序不会算出第二个0那里可以放1的水。
我感觉应该一直DFS直到找不到比弹出元素更小的邻居。

【在 p*****2 的大作中提到】
:
: 想知道你怎么这么扣性能呀?
: 一般来说面试性能的提升主要是复杂度的改善,比赛的时候只要时间规定之内能过就行
: ,不用扣的很死。一般写代码之前能算个大概。

avatar
p*2
21

-
水。
你是对的。我update了一下逻辑。你看看怎么样。

【在 f*****w 的大作中提到】
: 我有个疑问, 假设如下的情况
: 3 3 3 3
: 3 0 0 3
: 3 1 3 3
: 第一次从queue里面弹出的是1, 找邻居的话会加入0进入队列。然后更新count = 1 -
: 0 = 1
: 但是在循环的时候会弹出0,邻居还是0, 此时程序不会算出第二个0那里可以放1的水。
: 我感觉应该一直DFS直到找不到比弹出元素更小的邻居。

avatar
h*i
22
这个是对的,二爷牛蛙

【在 p*****2 的大作中提到】
:
: -
: 水。
: 你是对的。我update了一下逻辑。你看看怎么样。

avatar
p*2
25

java。你需要scala的吗?怎么好久没见你了。

【在 H****r 的大作中提到】
: 2爷 v5 这个是java?
avatar
p*2
26

多谢大牛。

【在 h***i 的大作中提到】
: 这个是对的,二爷牛蛙
avatar
h*i
27
应该有O(n*n)的解,第一步从周围向中间扫描,标注所有能流到外面的点,所有未标注
的点组成很多group, 但是每个group都被标注点包围,这就转化成surrounded region
problem. 第二步,在每个没有被标注的点dfs,找到包围这个未标注group的最小高度
。每个未标注group只用找一次。

【在 l********r 的大作中提到】
: This one:
: http://leetcode.com/groups/twitter-interview/forum/topic/rain-w
: Don't see any good way so far.

avatar
l*b
28
赞一个! 这种问题感觉用fp反倒不好写了
avatar
d*n
29
Paste a solution with O(mn) complexity(coded in c#):
static int FindMaxWater(int[,] matrix, int m, int n)
{
// a 2d array with same size as matrix to hold maxim waters
int[,] potentialWater = new int[m, n];
List sequence = new List();
for (int i = 0; i < m; ++i)
{
// Find the ascending sequence from left to right
sequence.Clear();
sequence.Add(0);
for (int j = 1; j < n; ++j)
{
if (matrix[i, j] >= matrix[i, sequence.Last()])
{
sequence.Add(j);
}
}

int current = 0;
for(int k = 1; k {
while(current < sequence[k])
{
potentialWater[i, current] = matrix[i, sequence[k-1]]
- matrix[i, current];
++current;
}
}


// Find the ascending sequence from right to left
sequence.Clear();
sequence.Add(n-1);
for (int j = n-2; j >=0; --j)
{
if (matrix[i, j] >= matrix[i, sequence.Last()])
{
sequence.Add(j);
}
}

current = n-1;
for(int k = 1; k {
while(current > sequence[k])
{
potentialWater[i, current] = matrix[i, sequence[k-1]] -
matrix[i, current];
--current;
}
}
}


for (int j = 0; j < n; ++j)
{
// Find the ascending sequence from top to bottom
sequence.Clear();
sequence.Add(0);
for (int i = 1; i < m; ++i)
{
if (matrix[i, j] >= matrix[sequence.Last(), j])
{
sequence.Add(i);
}
}

int current = 0;
for(int k = 1; k {
while(current < sequence[k])
{
potentialWater[current, j] = Math.Min(potentialWater[
current, j], matrix[sequence[k-1], j] - matrix[current, j]);
++current;
}
}

// Find the ascending sequence from bottom to top
sequence.Clear();
sequence.Add(m-1);
for (int i = m-2; i >=0; --i)
{
if (matrix[i, j] >= matrix[sequence.Last(), j])
{
sequence.Add(i);
}
}

current = m-1;
for(int k = 1; k {
while(current > sequence[k])
{
potentialWater[current, j] = Math.Min(potentialWater[
current, j], matrix[sequence[k-1], j] - matrix[current, j]);
--current;
}
}
}

int ret = 0;
for (int i = 0; i < m; ++i)
{
for (int j = 0; j < n; ++j)
{
ret += potentialWater[i, j];
}
}
return ret;
}

【在 l*******b 的大作中提到】
: 赞一个! 这种问题感觉用fp反倒不好写了
avatar
H*r
30
嗯嗯嗯那

【在 p*****2 的大作中提到】
:
: 多谢大牛。

avatar
l*r
31

"如果邻居小的话", "如果邻居低的话", is "小" same as "低"?

【在 p*****2 的大作中提到】
:
: 多谢大牛。

avatar
p*2
32

嗯。

【在 l********r 的大作中提到】
:
: "如果邻居小的话", "如果邻居低的话", is "小" same as "低"?

avatar
s*x
33

多谢! 我感觉那个check 可能要更复杂一些, 比如说, rectangle 四个角上的 cell
应该是没用的, 它们两侧相邻的 cell 应该足可以 hold water 了。

【在 p*****2 的大作中提到】
: 写了一个。大家看看如果没什么问题。放到我的博客里去。
: http://blog.sina.com.cn/s/blog_b9285de20101j9a7.html

avatar
f*s
35
难道不是和一维类似吗?
先每一行从左到又扫,再从右到左扫。得到两个矩阵
然后每一列从上到下扫,再从下到上扫,得到两个矩阵。
然后扫一遍矩阵。
avatar
p*2
37

你是每个cell只考虑四个方向吗?

【在 f****s 的大作中提到】
: 难道不是和一维类似吗?
: 先每一行从左到又扫,再从右到左扫。得到两个矩阵
: 然后每一列从上到下扫,再从下到上扫,得到两个矩阵。
: 然后扫一遍矩阵。

avatar
l*b
38
这个肯定不对吧。
我的考虑是从最外一圈开始扫描,存一个used的map,然后在扫描的结果里面取最小值
,如果没有就随便取一个,然后从那个点开始做4向的DFS或者BSF,如果这个点的值小
于当前的值,求差,存近result里面,然后在used map里面mark这个点。如果这个点的
值大于当前的值,标记一下这个点,用于下一轮求最小值,因为这个是一个新的border
了。
一直重复这个知道所有的点都在used map里面mark了。
好像很复杂的样子。。。

【在 p*****2 的大作中提到】
:
: 你是每个cell只考虑四个方向吗?

avatar
p*2
39

border
我也觉得不行。我的基本思路:用两个数据结构
1. visited matrix 表明已经用过的cell
2. PriorityQueue放目前的边界
PQ总是弹出最低的cell。得到最低的cell以后找没有访问过的邻居。如果邻居小的话,
就可以装水了。把邻居放入PQ中作为新的边界(如果邻居低的话,用当前height代替邻
居的高度)。这样一直到PQ为空。复杂度N*N*logN, 程序不是很复杂。

【在 l**b 的大作中提到】
: 这个肯定不对吧。
: 我的考虑是从最外一圈开始扫描,存一个used的map,然后在扫描的结果里面取最小值
: ,如果没有就随便取一个,然后从那个点开始做4向的DFS或者BSF,如果这个点的值小
: 于当前的值,求差,存近result里面,然后在used map里面mark这个点。如果这个点的
: 值大于当前的值,标记一下这个点,用于下一轮求最小值,因为这个是一个新的border
: 了。
: 一直重复这个知道所有的点都在used map里面mark了。
: 好像很复杂的样子。。。

avatar
c*t
41
你写的太简洁了,佩服。原来真的不用刻意删除PQ里的元素啊。
我想的是visited的应该从pq里删除。又想pq删除效率不高,就改用hashmap.还得每次
遍历找map里的最小值。真是越走越偏啊。比你复杂好多。但你觉得效率是不是高些?
BTW, welcome back to java!

【在 p*****2 的大作中提到】
: 写了一个。大家看看如果没什么问题。放到我的博客里去。
: http://blog.sina.com.cn/s/blog_b9285de20101j9a7.html

avatar
f*s
42
我错了,大家鄙视我吧,学习去了。
avatar
c*t
43
二爷,我和你的codes还有一个区别
你的check只查一个点,然后放入min heap. 我考虑的是,如果check的点比curr min小
,肯定就是new min,所以直接从它继续check. 只有比curr min大的点才入heap.所以我
是直接把dfs写到check里了。你觉得是不是效率高一点?

【在 p*****2 的大作中提到】
: 写了一个。大家看看如果没什么问题。放到我的博客里去。
: http://blog.sina.com.cn/s/blog_b9285de20101j9a7.html

avatar
p*2
44

应该没什么大区别吧。只是你这个就不需要enqueue,一直小的情况应该并不多见,代
码会复杂一些吧?

【在 c********t 的大作中提到】
: 二爷,我和你的codes还有一个区别
: 你的check只查一个点,然后放入min heap. 我考虑的是,如果check的点比curr min小
: ,肯定就是new min,所以直接从它继续check. 只有比curr min大的点才入heap.所以我
: 是直接把dfs写到check里了。你觉得是不是效率高一点?

avatar
c*t
45
嗯,那在check method里,visited过得直接从min heap里去掉,有没有效率提升?(
见我上上帖子)

【在 p*****2 的大作中提到】
:
: 应该没什么大区别吧。只是你这个就不需要enqueue,一直小的情况应该并不多见,代
: 码会复杂一些吧?

avatar
p*2
46

应该没有什么大关系吧?

【在 c********t 的大作中提到】
: 嗯,那在check method里,visited过得直接从min heap里去掉,有没有效率提升?(
: 见我上上帖子)

avatar
p*2
47

想知道你怎么这么扣性能呀?
一般来说面试性能的提升主要是复杂度的改善,比赛的时候只要时间规定之内能过就行
,不用扣的很死。一般写代码之前能算个大概。

【在 c********t 的大作中提到】
: 嗯,那在check method里,visited过得直接从min heap里去掉,有没有效率提升?(
: 见我上上帖子)

avatar
c*t
48
你说得对,我有点走火入魔了。

★ 发自iPhone App: ChineseWeb 7.8

【在 p*****2 的大作中提到】
:
: 想知道你怎么这么扣性能呀?
: 一般来说面试性能的提升主要是复杂度的改善,比赛的时候只要时间规定之内能过就行
: ,不用扣的很死。一般写代码之前能算个大概。

avatar
f*w
49
我有个疑问, 假设如下的情况
3 3 3 3
3 0 0 3
3 1 3 3
第一次从queue里面弹出的是1, 找邻居的话会加入0进入队列。然后更新count = 1 -
0 = 1
但是在循环的时候会弹出0,邻居还是0, 此时程序不会算出第二个0那里可以放1的水。
我感觉应该一直DFS直到找不到比弹出元素更小的邻居。

【在 p*****2 的大作中提到】
:
: 想知道你怎么这么扣性能呀?
: 一般来说面试性能的提升主要是复杂度的改善,比赛的时候只要时间规定之内能过就行
: ,不用扣的很死。一般写代码之前能算个大概。

avatar
p*2
50

-
水。
你是对的。我update了一下逻辑。你看看怎么样。

【在 f*****w 的大作中提到】
: 我有个疑问, 假设如下的情况
: 3 3 3 3
: 3 0 0 3
: 3 1 3 3
: 第一次从queue里面弹出的是1, 找邻居的话会加入0进入队列。然后更新count = 1 -
: 0 = 1
: 但是在循环的时候会弹出0,邻居还是0, 此时程序不会算出第二个0那里可以放1的水。
: 我感觉应该一直DFS直到找不到比弹出元素更小的邻居。

avatar
h*i
51
这个是对的,二爷牛蛙

【在 p*****2 的大作中提到】
:
: -
: 水。
: 你是对的。我update了一下逻辑。你看看怎么样。

avatar
p*2
54

java。你需要scala的吗?怎么好久没见你了。

【在 H****r 的大作中提到】
: 2爷 v5 这个是java?
avatar
p*2
55

多谢大牛。

【在 h***i 的大作中提到】
: 这个是对的,二爷牛蛙
avatar
h*i
56
应该有O(n*n)的解,第一步从周围向中间扫描,标注所有能流到外面的点,所有未标注
的点组成很多group, 但是每个group都被标注点包围,这就转化成surrounded region
problem. 第二步,在每个没有被标注的点dfs,找到包围这个未标注group的最小高度
。每个未标注group只用找一次。

【在 l********r 的大作中提到】
: This one:
: http://leetcode.com/groups/twitter-interview/forum/topic/rain-w
: Don't see any good way so far.

avatar
l*b
57
赞一个! 这种问题感觉用fp反倒不好写了
avatar
d*n
58
Paste a solution with O(mn) complexity(coded in c#):
static int FindMaxWater(int[,] matrix, int m, int n)
{
// a 2d array with same size as matrix to hold maxim waters
int[,] potentialWater = new int[m, n];
List sequence = new List();
for (int i = 0; i < m; ++i)
{
// Find the ascending sequence from left to right
sequence.Clear();
sequence.Add(0);
for (int j = 1; j < n; ++j)
{
if (matrix[i, j] >= matrix[i, sequence.Last()])
{
sequence.Add(j);
}
}

int current = 0;
for(int k = 1; k {
while(current < sequence[k])
{
potentialWater[i, current] = matrix[i, sequence[k-1]]
- matrix[i, current];
++current;
}
}


// Find the ascending sequence from right to left
sequence.Clear();
sequence.Add(n-1);
for (int j = n-2; j >=0; --j)
{
if (matrix[i, j] >= matrix[i, sequence.Last()])
{
sequence.Add(j);
}
}

current = n-1;
for(int k = 1; k {
while(current > sequence[k])
{
potentialWater[i, current] = matrix[i, sequence[k-1]] -
matrix[i, current];
--current;
}
}
}


for (int j = 0; j < n; ++j)
{
// Find the ascending sequence from top to bottom
sequence.Clear();
sequence.Add(0);
for (int i = 1; i < m; ++i)
{
if (matrix[i, j] >= matrix[sequence.Last(), j])
{
sequence.Add(i);
}
}

int current = 0;
for(int k = 1; k {
while(current < sequence[k])
{
potentialWater[current, j] = Math.Min(potentialWater[
current, j], matrix[sequence[k-1], j] - matrix[current, j]);
++current;
}
}

// Find the ascending sequence from bottom to top
sequence.Clear();
sequence.Add(m-1);
for (int i = m-2; i >=0; --i)
{
if (matrix[i, j] >= matrix[sequence.Last(), j])
{
sequence.Add(i);
}
}

current = m-1;
for(int k = 1; k {
while(current > sequence[k])
{
potentialWater[current, j] = Math.Min(potentialWater[
current, j], matrix[sequence[k-1], j] - matrix[current, j]);
--current;
}
}
}

int ret = 0;
for (int i = 0; i < m; ++i)
{
for (int j = 0; j < n; ++j)
{
ret += potentialWater[i, j];
}
}
return ret;
}

【在 l*******b 的大作中提到】
: 赞一个! 这种问题感觉用fp反倒不好写了
avatar
H*r
59
嗯嗯嗯那

【在 p*****2 的大作中提到】
:
: 多谢大牛。

avatar
l*r
60

"如果邻居小的话", "如果邻居低的话", is "小" same as "低"?

【在 p*****2 的大作中提到】
:
: 多谢大牛。

avatar
p*2
61

嗯。

【在 l********r 的大作中提到】
:
: "如果邻居小的话", "如果邻居低的话", is "小" same as "低"?

avatar
s*x
62

多谢! 我感觉那个check 可能要更复杂一些, 比如说, rectangle 四个角上的 cell
应该是没用的, 它们两侧相邻的 cell 应该足可以 hold water 了。

【在 p*****2 的大作中提到】
: 写了一个。大家看看如果没什么问题。放到我的博客里去。
: http://blog.sina.com.cn/s/blog_b9285de20101j9a7.html

avatar
d*n
63
I posted the O(mn)at http://codeanytime.blogspot.com/

cell

【在 s**x 的大作中提到】
:
: 多谢! 我感觉那个check 可能要更复杂一些, 比如说, rectangle 四个角上的 cell
: 应该是没用的, 它们两侧相邻的 cell 应该足可以 hold water 了。

avatar
g*e
64
// follow physics law to fill the cubes with rain drops
void fillWater(int & arr[][], int x, int y, int & dropCount);
// bfs search to see if (x,y) is the local lowest, if so, fill all area with
the same height as (x,y), to the height of lowest edge surrounding it,
update arr[][] to simulate fill water, and count the total drops filled. If
(x,y) not the local lowest, do nothing.
int fill(int &arr[][], int x, int y){
int dropCount=0;
int preDropCount=0;
do{
for(int i=1;ifor(int j=1;jfillWater(arr, i, j, dropCount);
}while(preDropCount < dropCount);
return dropCount;
}
avatar
s*x
65

正在看这个题,发现关键是弹出来的那个位置可能起不到边界的作用了。 比如假设(0,
0) 位置最低,但它不起任何作用,因为(0,1) 和(1,0) 就可以挡住水了,所以 (0,
0) 应该直接忽略。
同样比如
ABCD
EFGH
假设ABCDFG 已经访问,EH 还没访问,如果B位置最低, B也应忽略,因为 AFGD 就构
成边界了。
貌似很多这种情况,不知道如何有效分别出来。
就是说,若果弹出来的位置删除后,边界仍然完整,这个位置就直接 ignore.

【在 p*****2 的大作中提到】
: 写了一个。大家看看如果没什么问题。放到我的博客里去。
: http://blog.sina.com.cn/s/blog_b9285de20101j9a7.html

avatar
g*s
66
这题我曾经想了好久,试了好多方法,最后还是用了peking2(leetcode1337)的那个
。Orz一下
avatar
z*3
67
没认真看代码,不过光看描述
是不是有一个小问题?
如果这样做的话,是不是假设只有一个装水的点?
比如
33333
30313
33333
这种其实可以装3+2=5unit的水
但是如果只从0那个点装水并找周边的边界的话
会忽略掉1那个装水点
所以第一步是不是先把所有相对低点给找出来
然后挨个弹出来,再寻找最低边界在哪里
同时储存所有遍历过的点
最后用最低边界高度来减去每一个遍历过的点计算units

【在 p*****2 的大作中提到】
:
: 嗯。

avatar
z*3
68
想了下
先随机找一个点,然后往下流,一直流到一个低点,然后从这个低点根据二爷那个方法
计算储量
然后看是否走遍全部matrix,如果没有,继续再在未访问过的地方随机找一个点
然后往下流,流到一个低点,然后计算储量
直到所有的点都被访问
avatar
c*3
69
去看二爷博客 二爷早已解决了
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。