LeetCode 378. Kth Smallest Element in a Sorted Matrix in F#

URL

leetcode.com/problems/kth-smallest-element-..

Code

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

#r "nuget:FSharpx.Collections"

open FSharpx.Collections

[<CustomEquality; CustomComparison>]
type Data =
    { Value: int
      Row: int
      Col: int }

    override this.GetHashCode() = hash this

    override this.Equals other =
        match other with
        | :? Data as o ->
            this.Value = o.Value
            && this.Row = o.Row
            && this.Col = o.Col
        | _ -> false

    interface System.IComparable with
        member this.CompareTo other =
            match other with
            | :? Data as o -> compare this.Value o.Value
            | _ -> failwith "cannot compare with other types"

let kthSmallest (matrix: int [,]) (k: int) : int =
    let rec initPriorityQueye i (matrix: int [,]) (pq: IPriorityQueue<Data>) =
        if i >= (Array2D.length1 matrix) then
            pq
        else
            let pq' =
                PriorityQueue.insert
                    { Value = matrix.[i, 0]
                      Row = i
                      Col = 0 }
                    pq

            initPriorityQueye (i + 1) matrix pq'

    let rec kthSmallest' k (pq: IPriorityQueue<Data>) (matrix: int [,]) =
        if k = 0 then
            let d = PriorityQueue.peek pq
            d.Value
        else
            let d, pq' = PriorityQueue.pop pq

            if d.Col < (Array2D.length2 matrix) - 1 then
                kthSmallest'
                    (k - 1)
                    (PriorityQueue.insert
                        { Value = matrix.[d.Row, d.Col + 1]
                          Row = d.Row
                          Col = d.Col + 1 }
                        pq')
                    matrix
            else
                kthSmallest' (k - 1) pq' matrix

    let pq =
        initPriorityQueye 0 matrix (PriorityQueue.empty false)

    kthSmallest' (k - 1) pq matrix