LeetCode 376. Wiggle Subsequence in F#

URL

leetcode.com/problems/wiggle-subsequence

Code

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

let wiggleMaxLength (nums: int list) : int =
    let rec wiggleMaxLength' pos nums prev up cache =
        match nums with
        | [] -> 0, cache
        | h :: t ->
            match Map.tryFind (pos, prev, up) cache with
            | Some (v) -> v, cache
            | None ->
                let diff = h - prev

                let ret1, cache' =
                    if (up && diff < 0) || (not up && diff > 0) then
                        let v1, cache' = wiggleMaxLength' (pos + 1) t h (not up) cache
                        v1 + 1, cache'
                    else
                        0, cache

                let ret2, cache'' = wiggleMaxLength' (pos + 1) t prev up cache'
                let ret = System.Math.Max(ret1, ret2)
                ret, Map.add (pos, prev, up) ret cache''

    let ret1, cache = wiggleMaxLength' 0 nums 1001 true Map.empty
    let ret2, _ = wiggleMaxLength' 0 nums -1001 false cache

    System.Math.Max(ret1, ret2)