LeetCode 2256. Minimum Average Difference in F#
URL
leetcode.com/problems/minimum-average-diffe..
Code
github.com/syohex/dotnet-study/blob/master/..
let minimumAverageDifference (nums: int list) : int =
let rec accumulate nums sum acc =
match nums with
| [] -> acc |> List.rev
| h :: t -> accumulate t (sum + h) ((sum + h) :: acc)
let rec minimumAverageDifference' (accs: int64 list) (n: int64) (len: int64) (sum:int64) (min: int64) (ret:int64) =
match accs with
| [] -> ret |> int
| h :: [] ->
let a = h / n
if a < min then
minimumAverageDifference' [] (n + 1L) len sum a (n - 1L)
else
minimumAverageDifference' [] (n + 1L) len sum min ret
| h :: t ->
let a = h / n
let b = (sum - h) / (len - n)
let diff = System.Math.Abs(a - b)
if diff < min then
minimumAverageDifference' t (n + 1L) len sum diff (n - 1L)
else
minimumAverageDifference' t (n + 1L) len sum min ret
let sum = nums |> List.sum |> int64
let len = nums |> List.length |> int64
let accs = accumulate nums 0 [] |> List.map int64
minimumAverageDifference' accs 1 len sum (System.Int64.MaxValue) -1