LeetCode 1027. Longest Arithmetic Subsequence in F#

URL

Longest Arithmetic Subsequence - LeetCode

Code

https://github.com/syohex/dotnet-study/tree/master/fsharp/leetcode/problems/1027/main.fsx

open System

let longestArithSeqLength (nums: int list) : int =
    let rec longestArithSeqLength' (nums: int[]) i (dp: Map<int, int>[]) ret =
        if i >= nums.Length then
            ret
        else
            let dp', acc' =
                seq { 0 .. (i - 1) }
                |> Seq.fold
                    (fun ((dp: Map<int, int>[]), acc) j ->
                        let diff = nums.[i] - nums.[j]

                        let prev =
                            match Map.tryFind diff dp.[j] with
                            | Some(v) -> v
                            | None -> 1

                        dp.[i] <- Map.add diff (prev + 1) dp.[i]
                        let acc' = Math.Max(acc, prev + 1)
                        dp, acc')
                    (dp, ret)

            longestArithSeqLength' nums (i + 1) dp' acc'

    let nums' = List.toArray nums
    let dp = Array.init nums'.Length (fun _ -> Map.empty)
    longestArithSeqLength' nums' 1 dp 0