h**********y 发帖数: 1293 | 1 攒人品,求祝福!
别的题都蛮常见的。就这个没见过。
二维版本water trap问题。。
当场解决了。呵呵。。 |
f*******t 发帖数: 7549 | |
a***o 发帖数: 1182 | 3 求解法,这个想过,不会做啊
【在 h**********y 的大作中提到】 : 攒人品,求祝福! : 别的题都蛮常见的。就这个没见过。 : 二维版本water trap问题。。 : 当场解决了。呵呵。。
|
r*********n 发帖数: 4553 | |
j*****s 发帖数: 189 | |
c********t 发帖数: 5706 | 6 很强大! 你是brute force解法吗?复杂度多少?
【在 h**********y 的大作中提到】 : 攒人品,求祝福! : 别的题都蛮常见的。就这个没见过。 : 二维版本water trap问题。。 : 当场解决了。呵呵。。
|
p*****2 发帖数: 21240 | 7
大牛写个code出来看看?
【在 c********t 的大作中提到】 : 很强大! 你是brute force解法吗?复杂度多少?
|
l*******b 发帖数: 2586 | 8 brutal force也不会做呀...
【在 c********t 的大作中提到】 : 很强大! 你是brute force解法吗?复杂度多少?
|
l*******b 发帖数: 2586 | 9 想了个这个办法, 不知道好实现不?
建立一个高度的priority queue
把边界一圈push进去
当该queue非空时, 弹出最低的那个, 把该点未搜索过的领域push到queue里. 如果领域
比弹出的这个元素高度低, 那么就把差距加到总的可以积水的量里面
返回总积水量 |
h**********y 发帖数: 1293 | 10 从最外圈往里push。找当前圈内部的邻居。keep track 当前圈最矮的那个,邻居比这
个矮就算diff,accumulate到总水量,比这个高就代替原来圈上那个元素。。O(n)
其实和一维很类似。。
【在 c********t 的大作中提到】 : 很强大! 你是brute force解法吗?复杂度多少?
|
|
|
p*****2 发帖数: 21240 | 11
onsite吧?代码好写吗?
【在 h**********y 的大作中提到】 : 从最外圈往里push。找当前圈内部的邻居。keep track 当前圈最矮的那个,邻居比这 : 个矮就算diff,accumulate到总水量,比这个高就代替原来圈上那个元素。。O(n) : 其实和一维很类似。。
|
c******3 发帖数: 60 | 12 这个复杂度太高。用LZ的迭代法是不错的选择
【在 l*******b 的大作中提到】 : 想了个这个办法, 不知道好实现不? : 建立一个高度的priority queue : 把边界一圈push进去 : 当该queue非空时, 弹出最低的那个, 把该点未搜索过的领域push到queue里. 如果领域 : 比弹出的这个元素高度低, 那么就把差距加到总的可以积水的量里面 : 返回总积水量
|
p*****2 发帖数: 21240 | |
l*******b 发帖数: 2586 | 14 迭代感觉有点问题呀,
5 5 5 5
5 3 5 2
5 5 5 5
5 5 5 5
【在 c******3 的大作中提到】 : 这个复杂度太高。用LZ的迭代法是不错的选择
|
f******n 发帖数: 279 | |
p*****2 发帖数: 21240 | 16
这个有什么问题呀?
【在 l*******b 的大作中提到】 : 迭代感觉有点问题呀, : 5 5 5 5 : 5 3 5 2 : 5 5 5 5 : 5 5 5 5
|
M******7 发帖数: 30 | |
l*******b 发帖数: 2586 | 18 先看外面一圈最小的是2, 再看里面一圈, 发现3 的时候就不会增加water了. 所以一圈
一圈iterate肯定不灵吧
【在 p*****2 的大作中提到】 : : 这个有什么问题呀?
|
h**********y 发帖数: 1293 | 19 圈形状是动态变化的。不是正方形。。。。
【在 l*******b 的大作中提到】 : 先看外面一圈最小的是2, 再看里面一圈, 发现3 的时候就不会增加water了. 所以一圈 : 一圈iterate肯定不灵吧
|
h**********y 发帖数: 1293 | 20 本地有他们office
直接去office面第一轮的。。
【在 p*****2 的大作中提到】 : : 这个有什么问题呀?
|
|
|
l*******b 发帖数: 2586 | 21 嗯,边界应该是变化的都不一定是连续的, 所以两个办法复杂度是一样的吧
【在 h**********y 的大作中提到】 : 圈形状是动态变化的。不是正方形。。。。
|
c********t 发帖数: 5706 | 22 brute force解法很幼稚,lz很强大。
http://codingways.blogspot.com/2012/06/rain-water-trap-problem-
google一面现在太狠了,onsite还不只要多难啊!我算早死早托生了。
【在 p*****2 的大作中提到】 : : 这个有什么问题呀?
|
j*****y 发帖数: 1071 | 23 感觉光 leetcode 还不够阿, poj, zoj 得上了
【在 c********t 的大作中提到】 : brute force解法很幼稚,lz很强大。 : http://codingways.blogspot.com/2012/06/rain-water-trap-problem- : google一面现在太狠了,onsite还不只要多难啊!我算早死早托生了。
|
p*****2 发帖数: 21240 | 24
有这个趋势。大牛准备搞吗?可以一起搞。
【在 j*****y 的大作中提到】 : 感觉光 leetcode 还不够阿, poj, zoj 得上了
|
j*****y 发帖数: 1071 | 25 我是要搞了,二爷也要搞吗?
【在 p*****2 的大作中提到】 : : 有这个趋势。大牛准备搞吗?可以一起搞。
|
c********t 发帖数: 5706 | 26 如果中间到一个元素i,j, 这时候它有三个没访问的邻居,这时候应该用哪一个来替代
圈上那个元素?
这个圈元素数目是不是固定的4*(n-1)?
【在 h**********y 的大作中提到】 : 从最外圈往里push。找当前圈内部的邻居。keep track 当前圈最矮的那个,邻居比这 : 个矮就算diff,accumulate到总水量,比这个高就代替原来圈上那个元素。。O(n) : 其实和一维很类似。。
|
l*******b 发帖数: 2586 | 27 应该是3个都push进去, 如果高度比现在这个低, 那么它的高度用现在这个的高度代替
5 5 5 3 5 5 5
5 1 1 2 4 1 5
5 1 1 1 5 1 5
5 5 5 5 5 5 5
开始是
5 5 5 3 5 5 5
5 5
5 5
5 5 5 5 5 5 5
下一步, 同时积水3-1 + 3-2
5 5 5 * 5 5 5
5 3 3 4 5
5 5
5 5 5 5 5 5 5
接下来, 又得到积水4*(3-1)
5 5 5 * 5 5 5
5 3 * 3 4 5
5 3 3 3 5
5 5 5 5 5 5 5
再下来
5 5 5 * 5 5 5
5 * * * 4 5
5 * * * 5 5
5 5 5 5 5 5 5
再下来
5 5 5 * 5 5 5
5 * * * * 4 5
5 * * * 5 4 5
5 5 5 5 5 5 5
最后都是 * 都被取过了
【在 c********t 的大作中提到】 : 如果中间到一个元素i,j, 这时候它有三个没访问的邻居,这时候应该用哪一个来替代 : 圈上那个元素? : 这个圈元素数目是不是固定的4*(n-1)?
|
c********t 发帖数: 5706 | 28 嗯,同意,只有一个问题,我觉得对每一个点,应该只算上下左右4个,比如你的例子
,第一次3只应该对2起作用。然后像lz说的,比3小的算差值,比3大的push进去。
【在 l*******b 的大作中提到】 : 应该是3个都push进去, 如果高度比现在这个低, 那么它的高度用现在这个的高度代替 : 5 5 5 3 5 5 5 : 5 1 1 2 4 1 5 : 5 1 1 1 5 1 5 : 5 5 5 5 5 5 5 : 开始是 : 5 5 5 3 5 5 5 : 5 5 : 5 5 : 5 5 5 5 5 5 5
|
l*******b 发帖数: 2586 | 29 en, should have 4 neighbours instead of 8.
another thought: using a dfs for height less or equal to current height
might make the code a bit faster.
【在 c********t 的大作中提到】 : 嗯,同意,只有一个问题,我觉得对每一个点,应该只算上下左右4个,比如你的例子 : ,第一次3只应该对2起作用。然后像lz说的,比3小的算差值,比3大的push进去。
|
c********t 发帖数: 5706 | 30 dfs recursion写不下去了,比如从3开始,不知道何时应该终止.
睡了。明天改写iteration.coding和bfs一样繁琐了。
lz真是牛中牛啊!
【在 l*******b 的大作中提到】 : en, should have 4 neighbours instead of 8. : another thought: using a dfs for height less or equal to current height : might make the code a bit faster.
|
|
|
l*******b 发帖数: 2586 | 31 en, lz DaNiu
dfs recursion should return when the value of current pos is larger than
searching value. It will push current pos into the priority queue, then
return.
【在 c********t 的大作中提到】 : dfs recursion写不下去了,比如从3开始,不知道何时应该终止. : 睡了。明天改写iteration.coding和bfs一样繁琐了。 : lz真是牛中牛啊!
|
c********t 发帖数: 5706 | 32 循环是因为2->1->2->1 visited 矩阵用的有问,明天改。 minheap may not be a
good choice, since u may want remove element very often.
★ 发自iPhone App: ChineseWeb 7.8
【在 l*******b 的大作中提到】 : en, lz DaNiu : dfs recursion should return when the value of current pos is larger than : searching value. It will push current pos into the priority queue, then : return.
|
p*****2 发帖数: 21240 | 33
你先搞一下发发心得好吗?我以前稍微搞过一下。感觉还是有点难呀。
【在 j*****y 的大作中提到】 : 我是要搞了,二爷也要搞吗?
|
h***i 发帖数: 1970 | 34 楼主大牛呀。
【在 h**********y 的大作中提到】 : 攒人品,求祝福! : 别的题都蛮常见的。就这个没见过。 : 二维版本water trap问题。。 : 当场解决了。呵呵。。
|
i******r 发帖数: 793 | 35 出这种题目,干脆直接从ACM校队里面招人算了
这不是什么好的趋势 |
j*****y 发帖数: 1071 | 36 我也觉得 google现在出题目有点问题,直接搞竞赛题了
【在 i******r 的大作中提到】 : 出这种题目,干脆直接从ACM校队里面招人算了 : 这不是什么好的趋势
|
i******r 发帖数: 793 | 37 不是说竞赛题不能出
但是这种题目,没做过的有几个能知道算法,何况写程序
再说算法也只是一个基本功,还有很多其他方面的能力呢
这种面试的趋势有点偏了
【在 j*****y 的大作中提到】 : 我也觉得 google现在出题目有点问题,直接搞竞赛题了
|
j*****y 发帖数: 1071 | 38 没办法阿,是公司挑人,不是人挑公司。
【在 i******r 的大作中提到】 : 不是说竞赛题不能出 : 但是这种题目,没做过的有几个能知道算法,何况写程序 : 再说算法也只是一个基本功,还有很多其他方面的能力呢 : 这种面试的趋势有点偏了
|
c********t 发帖数: 5706 | 39 终于搞定,不是visited问题。而是循环里忘了把min variable重新赋值,导致一直用
以前的最小点,所以死循环。昨天熬夜实在是晕菜了。
【在 c********t 的大作中提到】 : 循环是因为2->1->2->1 visited 矩阵用的有问,明天改。 minheap may not be a : good choice, since u may want remove element very often. : : ★ 发自iPhone App: ChineseWeb 7.8
|
l*******b 发帖数: 2586 | 40 嗯最后用的什么做priority queue
【在 c********t 的大作中提到】 : 终于搞定,不是visited问题。而是循环里忘了把min variable重新赋值,导致一直用 : 以前的最小点,所以死循环。昨天熬夜实在是晕菜了。
|
|
|
c********t 发帖数: 5706 | 41 用的hashmap,每次要找一遍min, 比如你那个例子,要找一次3,再找一次4。好像没有
啥办法。
【在 l*******b 的大作中提到】 : 嗯最后用的什么做priority queue
|
a***o 发帖数: 1182 | 42 大拿贴个code学习一下,多谢
【在 c********t 的大作中提到】 : 终于搞定,不是visited问题。而是循环里忘了把min variable重新赋值,导致一直用 : 以前的最小点,所以死循环。昨天熬夜实在是晕菜了。
|
p*****2 发帖数: 21240 | 43
才看到你这个。我也是这个思路。感觉复杂度不高呀。准备今天练练。
【在 l*******b 的大作中提到】 : 想了个这个办法, 不知道好实现不? : 建立一个高度的priority queue : 把边界一圈push进去 : 当该queue非空时, 弹出最低的那个, 把该点未搜索过的领域push到queue里. 如果领域 : 比弹出的这个元素高度低, 那么就把差距加到总的可以积水的量里面 : 返回总积水量
|
h**********y 发帖数: 1293 | 44 攒人品,求祝福!
别的题都蛮常见的。就这个没见过。
二维版本water trap问题。。
当场解决了。呵呵。。 |
f*******t 发帖数: 7549 | |
a***o 发帖数: 1182 | 46 求解法,这个想过,不会做啊
【在 h**********y 的大作中提到】 : 攒人品,求祝福! : 别的题都蛮常见的。就这个没见过。 : 二维版本water trap问题。。 : 当场解决了。呵呵。。
|
r*********n 发帖数: 4553 | |
j*****s 发帖数: 189 | |
c********t 发帖数: 5706 | 49 很强大! 你是brute force解法吗?复杂度多少?
【在 h**********y 的大作中提到】 : 攒人品,求祝福! : 别的题都蛮常见的。就这个没见过。 : 二维版本water trap问题。。 : 当场解决了。呵呵。。
|
p*****2 发帖数: 21240 | 50
大牛写个code出来看看?
【在 c********t 的大作中提到】 : 很强大! 你是brute force解法吗?复杂度多少?
|
|
|
l*******b 发帖数: 2586 | 51 brutal force也不会做呀...
【在 c********t 的大作中提到】 : 很强大! 你是brute force解法吗?复杂度多少?
|
l*******b 发帖数: 2586 | 52 想了个这个办法, 不知道好实现不?
建立一个高度的priority queue
把边界一圈push进去
当该queue非空时, 弹出最低的那个, 把该点未搜索过的领域push到queue里. 如果领域
比弹出的这个元素高度低, 那么就把差距加到总的可以积水的量里面
返回总积水量 |
h**********y 发帖数: 1293 | 53 从最外圈往里push。找当前圈内部的邻居。keep track 当前圈最矮的那个,邻居比这
个矮就算diff,accumulate到总水量,比这个高就代替原来圈上那个元素。。O(n)
其实和一维很类似。。
【在 c********t 的大作中提到】 : 很强大! 你是brute force解法吗?复杂度多少?
|
p*****2 发帖数: 21240 | 54
onsite吧?代码好写吗?
【在 h**********y 的大作中提到】 : 从最外圈往里push。找当前圈内部的邻居。keep track 当前圈最矮的那个,邻居比这 : 个矮就算diff,accumulate到总水量,比这个高就代替原来圈上那个元素。。O(n) : 其实和一维很类似。。
|
c******3 发帖数: 60 | 55 这个复杂度太高。用LZ的迭代法是不错的选择
【在 l*******b 的大作中提到】 : 想了个这个办法, 不知道好实现不? : 建立一个高度的priority queue : 把边界一圈push进去 : 当该queue非空时, 弹出最低的那个, 把该点未搜索过的领域push到queue里. 如果领域 : 比弹出的这个元素高度低, 那么就把差距加到总的可以积水的量里面 : 返回总积水量
|
p*****2 发帖数: 21240 | |
l*******b 发帖数: 2586 | 57 迭代感觉有点问题呀,
5 5 5 5
5 3 5 2
5 5 5 5
5 5 5 5
【在 c******3 的大作中提到】 : 这个复杂度太高。用LZ的迭代法是不错的选择
|
f******n 发帖数: 279 | |
p*****2 发帖数: 21240 | 59
这个有什么问题呀?
【在 l*******b 的大作中提到】 : 迭代感觉有点问题呀, : 5 5 5 5 : 5 3 5 2 : 5 5 5 5 : 5 5 5 5
|
M******7 发帖数: 30 | |
|
|
l*******b 发帖数: 2586 | 61 先看外面一圈最小的是2, 再看里面一圈, 发现3 的时候就不会增加water了. 所以一圈
一圈iterate肯定不灵吧
【在 p*****2 的大作中提到】 : : 这个有什么问题呀?
|
h**********y 发帖数: 1293 | 62 圈形状是动态变化的。不是正方形。。。。
【在 l*******b 的大作中提到】 : 先看外面一圈最小的是2, 再看里面一圈, 发现3 的时候就不会增加water了. 所以一圈 : 一圈iterate肯定不灵吧
|
h**********y 发帖数: 1293 | 63 本地有他们office
直接去office面第一轮的。。
【在 p*****2 的大作中提到】 : : 这个有什么问题呀?
|
l*******b 发帖数: 2586 | 64 嗯,边界应该是变化的都不一定是连续的, 所以两个办法复杂度是一样的吧
【在 h**********y 的大作中提到】 : 圈形状是动态变化的。不是正方形。。。。
|
c********t 发帖数: 5706 | 65 brute force解法很幼稚,lz很强大。
http://codingways.blogspot.com/2012/06/rain-water-trap-problem-
google一面现在太狠了,onsite还不只要多难啊!我算早死早托生了。
【在 p*****2 的大作中提到】 : : 这个有什么问题呀?
|
j*****y 发帖数: 1071 | 66 感觉光 leetcode 还不够阿, poj, zoj 得上了
【在 c********t 的大作中提到】 : brute force解法很幼稚,lz很强大。 : http://codingways.blogspot.com/2012/06/rain-water-trap-problem- : google一面现在太狠了,onsite还不只要多难啊!我算早死早托生了。
|
p*****2 发帖数: 21240 | 67
有这个趋势。大牛准备搞吗?可以一起搞。
【在 j*****y 的大作中提到】 : 感觉光 leetcode 还不够阿, poj, zoj 得上了
|
j*****y 发帖数: 1071 | 68 我是要搞了,二爷也要搞吗?
【在 p*****2 的大作中提到】 : : 有这个趋势。大牛准备搞吗?可以一起搞。
|
c********t 发帖数: 5706 | 69 如果中间到一个元素i,j, 这时候它有三个没访问的邻居,这时候应该用哪一个来替代
圈上那个元素?
这个圈元素数目是不是固定的4*(n-1)?
【在 h**********y 的大作中提到】 : 从最外圈往里push。找当前圈内部的邻居。keep track 当前圈最矮的那个,邻居比这 : 个矮就算diff,accumulate到总水量,比这个高就代替原来圈上那个元素。。O(n) : 其实和一维很类似。。
|
l*******b 发帖数: 2586 | 70 应该是3个都push进去, 如果高度比现在这个低, 那么它的高度用现在这个的高度代替
5 5 5 3 5 5 5
5 1 1 2 4 1 5
5 1 1 1 5 1 5
5 5 5 5 5 5 5
开始是
5 5 5 3 5 5 5
5 5
5 5
5 5 5 5 5 5 5
下一步, 同时积水3-1 + 3-2
5 5 5 * 5 5 5
5 3 3 4 5
5 5
5 5 5 5 5 5 5
接下来, 又得到积水4*(3-1)
5 5 5 * 5 5 5
5 3 * 3 4 5
5 3 3 3 5
5 5 5 5 5 5 5
再下来
5 5 5 * 5 5 5
5 * * * 4 5
5 * * * 5 5
5 5 5 5 5 5 5
再下来
5 5 5 * 5 5 5
5 * * * * 4 5
5 * * * 5 4 5
5 5 5 5 5 5 5
最后都是 * 都被取过了
【在 c********t 的大作中提到】 : 如果中间到一个元素i,j, 这时候它有三个没访问的邻居,这时候应该用哪一个来替代 : 圈上那个元素? : 这个圈元素数目是不是固定的4*(n-1)?
|
|
|
c********t 发帖数: 5706 | 71 嗯,同意,只有一个问题,我觉得对每一个点,应该只算上下左右4个,比如你的例子
,第一次3只应该对2起作用。然后像lz说的,比3小的算差值,比3大的push进去。
【在 l*******b 的大作中提到】 : 应该是3个都push进去, 如果高度比现在这个低, 那么它的高度用现在这个的高度代替 : 5 5 5 3 5 5 5 : 5 1 1 2 4 1 5 : 5 1 1 1 5 1 5 : 5 5 5 5 5 5 5 : 开始是 : 5 5 5 3 5 5 5 : 5 5 : 5 5 : 5 5 5 5 5 5 5
|
l*******b 发帖数: 2586 | 72 en, should have 4 neighbours instead of 8.
another thought: using a dfs for height less or equal to current height
might make the code a bit faster.
【在 c********t 的大作中提到】 : 嗯,同意,只有一个问题,我觉得对每一个点,应该只算上下左右4个,比如你的例子 : ,第一次3只应该对2起作用。然后像lz说的,比3小的算差值,比3大的push进去。
|
c********t 发帖数: 5706 | 73 dfs recursion写不下去了,比如从3开始,不知道何时应该终止.
睡了。明天改写iteration.coding和bfs一样繁琐了。
lz真是牛中牛啊!
【在 l*******b 的大作中提到】 : en, should have 4 neighbours instead of 8. : another thought: using a dfs for height less or equal to current height : might make the code a bit faster.
|
l*******b 发帖数: 2586 | 74 en, lz DaNiu
dfs recursion should return when the value of current pos is larger than
searching value. It will push current pos into the priority queue, then
return.
【在 c********t 的大作中提到】 : dfs recursion写不下去了,比如从3开始,不知道何时应该终止. : 睡了。明天改写iteration.coding和bfs一样繁琐了。 : lz真是牛中牛啊!
|
c********t 发帖数: 5706 | 75 循环是因为2->1->2->1 visited 矩阵用的有问,明天改。 minheap may not be a
good choice, since u may want remove element very often.
★ 发自iPhone App: ChineseWeb 7.8
【在 l*******b 的大作中提到】 : en, lz DaNiu : dfs recursion should return when the value of current pos is larger than : searching value. It will push current pos into the priority queue, then : return.
|
p*****2 发帖数: 21240 | 76
你先搞一下发发心得好吗?我以前稍微搞过一下。感觉还是有点难呀。
【在 j*****y 的大作中提到】 : 我是要搞了,二爷也要搞吗?
|
h***i 发帖数: 1970 | 77 楼主大牛呀。
【在 h**********y 的大作中提到】 : 攒人品,求祝福! : 别的题都蛮常见的。就这个没见过。 : 二维版本water trap问题。。 : 当场解决了。呵呵。。
|
i******r 发帖数: 793 | 78 出这种题目,干脆直接从ACM校队里面招人算了
这不是什么好的趋势 |
j*****y 发帖数: 1071 | 79 我也觉得 google现在出题目有点问题,直接搞竞赛题了
【在 i******r 的大作中提到】 : 出这种题目,干脆直接从ACM校队里面招人算了 : 这不是什么好的趋势
|
i******r 发帖数: 793 | 80 不是说竞赛题不能出
但是这种题目,没做过的有几个能知道算法,何况写程序
再说算法也只是一个基本功,还有很多其他方面的能力呢
这种面试的趋势有点偏了
【在 j*****y 的大作中提到】 : 我也觉得 google现在出题目有点问题,直接搞竞赛题了
|
|
|
j*****y 发帖数: 1071 | 81 没办法阿,是公司挑人,不是人挑公司。
【在 i******r 的大作中提到】 : 不是说竞赛题不能出 : 但是这种题目,没做过的有几个能知道算法,何况写程序 : 再说算法也只是一个基本功,还有很多其他方面的能力呢 : 这种面试的趋势有点偏了
|
c********t 发帖数: 5706 | 82 终于搞定,不是visited问题。而是循环里忘了把min variable重新赋值,导致一直用
以前的最小点,所以死循环。昨天熬夜实在是晕菜了。
【在 c********t 的大作中提到】 : 循环是因为2->1->2->1 visited 矩阵用的有问,明天改。 minheap may not be a : good choice, since u may want remove element very often. : : ★ 发自iPhone App: ChineseWeb 7.8
|
l*******b 发帖数: 2586 | 83 嗯最后用的什么做priority queue
【在 c********t 的大作中提到】 : 终于搞定,不是visited问题。而是循环里忘了把min variable重新赋值,导致一直用 : 以前的最小点,所以死循环。昨天熬夜实在是晕菜了。
|
c********t 发帖数: 5706 | 84 用的hashmap,每次要找一遍min, 比如你那个例子,要找一次3,再找一次4。好像没有
啥办法。
【在 l*******b 的大作中提到】 : 嗯最后用的什么做priority queue
|
a***o 发帖数: 1182 | 85 大拿贴个code学习一下,多谢
【在 c********t 的大作中提到】 : 终于搞定,不是visited问题。而是循环里忘了把min variable重新赋值,导致一直用 : 以前的最小点,所以死循环。昨天熬夜实在是晕菜了。
|
p*****2 发帖数: 21240 | 86
才看到你这个。我也是这个思路。感觉复杂度不高呀。准备今天练练。
【在 l*******b 的大作中提到】 : 想了个这个办法, 不知道好实现不? : 建立一个高度的priority queue : 把边界一圈push进去 : 当该queue非空时, 弹出最低的那个, 把该点未搜索过的领域push到queue里. 如果领域 : 比弹出的这个元素高度低, 那么就把差距加到总的可以积水的量里面 : 返回总积水量
|
f*******t 发帖数: 7549 | 87 写了一下,牛算法实现和理解起来挺简单的
import java.util.PriorityQueue;
public class RainWater2D {
private final int[][] directions = {
{1, 0}, {0, 1}, {-1, 0}, {0, -1}
};
private int width, height;
private class Point implements Comparable {
public int x, y, h;
public Point(int y, int x, int h) {
this.y = y;
this.x = x;
this.h = h;
}
@Override
public int compareTo(Point p) {
return h > p.h ? 1 : -1;
}
}
private boolean isValid(int y, int x) {
if (y < 0 || x < 0 || y >= height || x >= width)
return false;
return true;
}
public int preserveWater(int[][] A) {
if (A == null || A.length < 3 || A[0].length < 3)
return 0;
height = A.length;
width = A[0].length;
boolean[][] visited = new boolean[height][width];
int water = 0;
PriorityQueue heap = new PriorityQueue();
for (int i = 0; i < width; i++) {
heap.add(new Point(0, i, A[0][i]));
visited[0][i] = true;
heap.add(new Point(height - 1, i, A[height - 1][i]));
visited[height - 1][i] = true;
}
for (int i = 1; i < height - 1; i++) {
heap.add(new Point(i, 0, A[i][0]));
visited[i][0] = true;
heap.add(new Point(i, width - 1, A[i][width - 1]));
visited[i][width - 1] = true;
}
while (!heap.isEmpty()) {
Point p = heap.poll();
for (int i = 0; i < 4; i++) {
int ny = p.y + directions[i][0];
int nx = p.x + directions[i][1];
if (isValid(ny, nx) && !visited[ny][nx]) {
if (A[ny][nx] < p.h) {
water = p.h - A[ny][nx] + water;
heap.add(new Point(ny, nx, p.h));
} else
heap.add(new Point(ny, nx, A[ny][nx]));
visited[ny][nx] = true;
}
}
}
return water;
}
public static void main(String[] args) {
int[][] A = {
{5, 5, 5, 5},
{5, 3, 2, 5},
{5, 4, 4, 5},
{5, 1, 5, 5}
};
RainWater2D r = new RainWater2D();
System.out.println(r.preserveWater(A));
}
} |