LeetCode 962. Maximum Width Ramp in F#

URL

Maximum Width Ramp - LeetCode

Code

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

let maxWidthRamp (nums: int list) : int =
    let rec maxWidthRamp' left right (nums: int[]) (rightLargests: int[]) acc =
        if right >= nums.Length then
            acc
        elif left < right && nums.[left] > rightLargests.[right] then
            maxWidthRamp' (left + 1) right nums rightLargests acc
        else
            let acc' = max acc (right - left)
            maxWidthRamp' left (right + 1) nums rightLargests acc'

    let rightLargests =
        nums
        |> List.rev
        |> List.fold (fun (acc, prev) num -> if num > prev then num :: acc, num else prev :: acc, prev) ([], -1)
        |> fst
        |> List.rev
        |> List.toArray

    maxWidthRamp' 0 0 (List.toArray nums) rightLargests 0