27 lines
756 B
Elixir
27 lines
756 B
Elixir
defmodule Solution do
|
|
@spec max_area(height :: [integer]) :: integer
|
|
def max_area(height) do
|
|
iter(0, height, 0, 0)
|
|
end
|
|
|
|
defp iter(prev, [head | tail], head_idx, max_vol) do
|
|
if prev >= head do
|
|
iter(prev, tail, head_idx + 1, max_vol)
|
|
else
|
|
max_vol = iter_inner(head, head_idx, tail, head_idx + 1, max_vol)
|
|
iter(head, tail, head_idx + 1, max_vol)
|
|
end
|
|
end
|
|
|
|
defp iter(_, [], _, max_vol), do: max_vol
|
|
|
|
defp iter_inner(a, a_idx, [head | tail], head_idx, max_vol) do
|
|
distance = head_idx - a_idx
|
|
min_height = min(a, head)
|
|
volume = min_height * distance
|
|
max_vol = max(max_vol, volume)
|
|
iter_inner(a, a_idx, tail, head_idx + 1, max_vol)
|
|
end
|
|
|
|
defp iter_inner(_, _, [], _, max_vol), do: max_vol
|
|
end
|