【发布时间】:2014-12-26 01:36:29
【问题描述】:
我正在练习算法,我在这个问题上卡了几天。当我测试我的解决方案时,我仍然不正确。这是问题陈述:
纽约的华尔街以其令人叹为观止的摩天大楼而闻名。 但是雨季快到了,水量 今年会倒塌的建筑物将是巨大的。自从 每个建筑物都粘在它的左边和右边的建筑物上 (除了第一个和最后一个),水可以从一个 仅当建筑物的高度高于高度时才建造 建筑物的左侧或右侧(边缘的高度 华尔街的指数是 0)。所有建筑物的宽度均为1米。你 给出华尔街建筑物的高度(以米为单位) 从左到右,你的任务是打印到标准输出 (stdout) 水的总量(以立方米为单位) 华尔街的建筑物。
输入示例:
heights: [9 8 7 8 9 5 6]
示例输出:
5
解释: 在这个例子中,第一栋和第五栋之间有 4 立方米的水(第二栋有 1 立方米,第三栋有 2 立方米,第四栋有 1 立方米),第五栋和第七栋楼之间有 1 立方米蓄水量(在第六座建筑物上)。
我解决这个问题的方法是找到全局最大值,并使用这些最大值的差异来计算积水。我使用 local_water 变量计算了我最后可能错过的水。谁能帮我找出我的算法或代码中的错误?
注意:我正在寻找一个只通过每个元素一次的解决方案
这是我有错误的输入:
heights: [8,8,4,5]
这个输入应该产生1,而不是我的答案0。
这是我的代码:
def skyscrapers(heights):
heights.insert(0,0)
heights.append(0)
local_max = 0
global_max = 0
total_water = 0
local_water = 0
end_water = []
# end_water records water heights to be used for finding
# water between the final global maximum and
# subsequent local maximums. These potential values are
# stored in local_water.
for i in range(1, len(heights)-1):
end_water.append(heights[i])
# check for local max
if heights[i-1] < heights[i] and heights[i] > heights[i+1]:
# record potential collected water for after final
# gloabl max
for s in end_water:
local_water += (heights[i] - s) * (heights[i] - s > 0)
local_max=i
# new global max
if heights[local_max] > heights[global_max]:
for s in heights[global_max:local_max]:
if heights[global_max] - s > 0:
total_water += heights[global_max] - s
global_max = local_max
local_water = 0
end_water = []
total_water += local_water
print total_water
【问题讨论】: