LeetCode 1552. Magnetic Force Between Two Balls in F#

URL

Magnetic Force Between Two Balls - LeetCode

Code

https://github.com/syohex/dotnet-study/tree/master/fsharp/leetcode/challenge/202406/magnetic_force_between_two_balls/main.fsx

let canPutBalls position force m =
    let rec canPutBalls' position force prev balls =
        match position with
        | [] -> false
        | h :: t ->
            if h - prev >= force then
                let balls' = balls + 1
                if balls' = m then true else canPutBalls' t force h balls'
            else
                canPutBalls' t force prev balls

    match position with
    | [] -> false
    | h :: t -> canPutBalls' t force h 1

let maxDistance (position: int list) (m: int) =
    let rec maxDistance' left right position ret =
        if left > right then
            ret
        else
            let mid = left + (right - left) / 2

            if canPutBalls position mid m then
                maxDistance' (mid + 1) right position mid
            else
                maxDistance' left (mid - 1) position ret

    let position' = List.sort position
    let diff = (List.last position') - (List.head position')
    let right = System.Math.Ceiling(double diff / (double m - 1.0)) |> int
    maxDistance' 1 right position' 0