LeetCode 1675. Minimize Deviation in Array in F#

URL

leetcode.com/problems/minimize-deviation-in..

Code

github.com/syohex/dotnet-study/blob/master/..

#r "nuget:FSharpx.Collections"

open FSharpx.Collections

let minimumDeviation (nums: int list) : int =
    let rec initQueue nums acc (q: IPriorityQueue<int>) : (IPriorityQueue<int> * int) =
        match nums with
        | [] -> q, (List.min acc)
        | x :: xs ->
            if x % 2 = 0 then
                initQueue xs (x :: acc) (PriorityQueue.insert x q)
            else
                let even = x * 2
                initQueue xs (even :: acc) (PriorityQueue.insert even q)

    let rec minimumDeviation' (q: IPriorityQueue<int>) min acc : int =
        if PriorityQueue.isEmpty q then
            acc |> List.min
        else
            let (head, tail) = PriorityQueue.pop q
            let diff = head - min

            if head % 2 = 1 then
                (diff :: acc) |> List.min
            else
                let v = head / 2
                let newMin = if v < min then v else min
                minimumDeviation' (PriorityQueue.insert v tail) newMin (diff :: acc)

    let q, min =
        initQueue nums [] (PriorityQueue.empty true)

    minimumDeviation' q min []