Я практикую алгоритмы, и я застрял в этой проблеме в течение нескольких дней. Когда я проверяю свое решение, я по-прежнему ошибаюсь. Вот описание проблемы:
Уолл-стрит в Нью-Йорке известна своими захватывающими небоскребами. Но приближается сезон дождей, и количество воды, которое упадет, здания в этом году будут огромными. поскольку каждое здание прикреплено к зданиям слева и справа (за исключением первого и последнего), вода может течь из если высота здания выше высоты от здания до его левого или правого (высота краев Уолл-стрит - 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