LeetCode 630. Course Schedule III in F#

URL

leetcode.com/problems/course-schedule-iii

Code

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

#r "nuget:FSharpx.Collections"

open FSharpx.Collections

let scheduleCourse (courses: (int * int) list) : int =
    let rec scheduleCourse' time courses q qLen =
        match courses with
        | [] -> qLen
        | (duration, lastDay) :: rest ->
            if time + duration <= lastDay then
                let q' = PriorityQueue.insert duration q
                scheduleCourse' (time + duration) rest q' (qLen + 1)
            else
                match PriorityQueue.tryPop q with
                | None -> scheduleCourse' time rest q qLen
                | Some (minDuration, q') ->
                    if minDuration > duration then
                        let time' = time - minDuration + duration
                        let q'' = PriorityQueue.insert duration q'
                        scheduleCourse' time' rest q'' qLen
                    else
                        scheduleCourse' time rest q qLen

    let courses' =
        courses
        |> List.sortWith (fun (_, lastDay1) (_, lastDay2) -> compare lastDay1 lastDay2)

    let q = PriorityQueue.empty true
    scheduleCourse' 0 courses' q 0