【发布时间】:2017-04-13 17:58:17
【问题描述】:
最近在 glassdoor-like 网站遇到一个面试问题,我找不到解决这个问题的优化解决方案:
这与困水问题完全不同。请通读示例。
给定一个输入数组,每个元素代表塔的高度,将浇水的量,索引号表示浇水的位置。每个塔的宽度为1。浇水后打印图形。
注意事项:
用
*表示塔,w表示1水量。-
浇注位置永远不会在峰值位置。无需考虑分水情况。
(如果您为这种情况提供了解决方案,则可以加分,您可以假设如果在峰值位置浇注 N/2 水,则 N/2 水向左,N/2 水向右。)
峰的定义:峰位的高度大于其旁边的左右索引。)
假设有 2 个极高的墙靠近直方图。
所以如果水量超过直方图的容量,
您应该指出容量编号并继续前进。请参见示例 2。假设水先向左,参见示例 1
示例 1:
int[] heights = {4,2,1,2,3,2,1,0,4,2,1}
It look like:
* *
* * **
** *** **
******* ***
+++++++++++ <- there'll always be a base layer
42123210431
Assume given this heights array, water amout 3, position 2:
打印:
* *
*ww * **
**w*** **
******* ***
+++++++++++
示例 2:
int[] heights = {4,2,1,2,3,2,1,0,4,2,1}, water amout 32, position 2
打印:
capacity:21
wwwwwwwwwww
*wwwwwww*ww
*www*www**w
**w***ww**w
*******w***
+++++++++++
起初我以为它就像the trapping water problem,但我错了。有人有解决这个问题的算法吗?
欢迎在代码中提供解释或 cmets。
注意:
捕水问题问的是容量,但这个问题引入了两个变量:水量和浇注指数。此外,水有流动的偏好。所以它不像困水问题。
【问题讨论】:
-
如果浇水位置是 3 个,您希望水流向左、向右(最深的山谷和最大容量)还是随机的?
-
@m69 先离开。如果左侧已满/无法加水,请向右走。
-
那么看起来很简单。制作一个 2D 网格,从顶部开始每一滴,往下走,如果不可能向左,如果不可能向右,重复直到卡住,重复每一滴。 (想一想,你可能必须直接穿过最顶层的水滴,看看那层是否还有空间,如果没有,则回溯。嗯,这毕竟不是那么简单:-) )
-
@m69。是的。毕竟没那么简单。理论上,会有一个线性时间解。与那个著名的陷雨问题相比,这种情况需要打印全图,而且很难,因为有两种情况:容量不足和容量过剩。
-
@Ken White。你还认为这是一个家庭作业的问题吗?还是重复的困雨问题?
标签: algorithm