Elixir Min Avg Two Slice
defmodule MinAvgTwoSlice do
def min_avg_two_slice(a) do
size = length(a)
a_map = a |> Enum.with_index() |> Map.new(fn {v, i} -> {i, v} end)
initial_avg = (Map.get(a_map, 0) + Map.get(a_map, 1)) / 2
{idx, _min_avg} =
Enum.reduce(0..(size - 2), {0, initial_avg}, fn i, {idx, min_avg} ->
two = (Map.get(a_map, i) + Map.get(a_map, i + 1)) / 2
cur =
if Map.has_key?(a_map, i + 2) do
three = (Map.get(a_map, i) + Map.get(a_map, i + 1) + Map.get(a_map, i + 2)) / 3
min(two, three)
else
two
end
if cur < min_avg, do: {i, cur}, else: {idx, min_avg}
end)
idx
end
end
This leans on the key trick for this problem: the minimum average slice is always length 2 or 3.