Haskell Min Avg Two Slice
import Data.Array (Array, listArray, (!))
minAvgTwoSlice :: [Int] -> Int
minAvgTwoSlice a = fst (foldl step (0, avg2 0) [0 .. n - 2])
where
n = length a
arr = listArray (0, n - 1) a :: Array Int Int
avg2 i = fromIntegral (arr ! i + arr ! (i + 1)) / 2 :: Double
avg3 i = fromIntegral (arr ! i + arr ! (i + 1) + arr ! (i + 2)) / 3 :: Double
candidate i
| i + 2 <= n - 1 = min (avg2 i) (avg3 i)
| otherwise = avg2 i
step (bestIdx, bestVal) i =
let cur = candidate i
in if cur < bestVal then (i, cur) else (bestIdx, bestVal)
This leans on the key trick for this problem: the minimum average slice is always length 2 or 3.