LeetCode 703. Kth Largest Element in a Stream in F#

URL

leetcode.com/problems/kth-largest-element-i..

Code

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

#r "nuget:FSharpx.Collections"

open FSharpx.Collections

type KthLargest =
    { k: int
      mutable len: int
      mutable q: IPriorityQueue<int> }

    static member popQueue len k queue =
        if len <= k then
            queue, len
        else
            let _, rest = PriorityQueue.pop queue
            KthLargest.popQueue (len - 1) k rest

    static member empty (k: int) (nums: int list) : KthLargest =
        let q =
            nums
            |> List.fold (fun acc n -> PriorityQueue.insert n acc) (PriorityQueue.empty false)

        let len = nums |> List.length
        let q', len' = KthLargest.popQueue len k q

        { k = k; len = len'; q = q' }

    member this.add(value: int) : int =
        this.q <- (PriorityQueue.insert value this.q)

        let q, len =
            KthLargest.popQueue (this.len + 1) this.k this.q

        this.len <- len
        this.q <- q

        PriorityQueue.peek this.q