你从一开始就没有明确表达出这个问题的答案。让我补充一些说明吧:
Case 1:
p = {2, 3, 4, 2, 1, 1, 2}; total = 13
|
| x |
| x | x | x | x x x |
| x | x | x | x | x | x |
Case 2:
p = {2, 3, 4, 2, 1, 3, 2, 2}; total = 18
|
| x | x x x |
| x | x | x | x x | x | x |
| x | x | x | x | x | x | x |
解决方案:开始从左到右扫描的分区。当你停在一个分区(称为start
)时,从右向左扫描以检查范围是否被较高分区细分(称为end
)。如果不是,继续向左推进end
,直到不再进行细分。水位是p[start]
和p[end]
的较低者。
伪代码(具有轻微夫特风味因为这是我用什么):
// The range from start to end is divided if there is
// a partition taller than the water level in-between
func isDivided(start, end) -> Bool {
waterLevel = min(p[start], p[end])
for i = end - 1; i > start; i-- {
if p[i] > waterLevel {
return true
}
}
return false
}
start = 0
volume = 0
while start < n - 1 {
end = n - 1
while isDivided(start, end) {
end--
}
waterLevel = min(p[start], p[end])
volume += waterLevel * (end - start)
print("segment = \(start) - \(end), water level = \(waterLevel)")
}
print("volume = \(volume)")
我假定p
阵列从0...(n-1)
索引
实例:
当p = {2, 3, 4, 2, 1, 1, 2}
时,它给出以下输出:
segment = 0 - 1, water level = 2
segment = 1 - 2, water level = 3
segment = 2 - 6, water level = 2
volume = 13
当p = {2, 3, 4, 2, 1, 3, 2, 2}
,这将返回:
segment = 0 - 1, water level = 2
segment = 1 - 2, water level = 3
segment = 2 - 5, water level = 3
segment = 5 - 7, water level = 2
volume = 18
你忘了问一个问题。如果你的意思是要求我们为这个问题写一个解决方案,那么你的问题太广泛了,无法在范围内。 –
“h4和h7之间有6个单位”?对我来说看起来像5。也许而不是“在上面的例子中”你的意思是:“在下面的例子中”? – alfasin
不,“h4和h7之间有6个单位”是第一个数字。 – PTDS