LeetCode 1493. Longest Subarray of 1's After Deleting One Element in F#

URL

Longest Subarray of 1's After Deleting One Element - LeetCode

Code

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

open System

let longestSubarray (nums: int list) : int =
    let rec collectOnes nums i start acc =
        match nums with
        | [] ->
            match start with
            | Some(v) -> ((v, i - v) :: acc) |> List.rev
            | None -> acc |> List.rev
        | h :: t ->
            match start with
            | Some(v) ->
                if h = 1 then
                    collectOnes t (i + 1) start acc
                else
                    collectOnes t (i + 1) None ((v, i - v) :: acc)
            | None ->
                if h = 1 then
                    collectOnes t (i + 1) (Some(i)) acc
                else
                    collectOnes t (i + 1) None acc

    let rec longestSubarray' pairs (prevStart, prevLength) (ret: int) =
        match pairs with
        | [] -> ret
        | (start, length) :: t ->
            if prevStart + prevLength + 1 = start then
                longestSubarray' t (start, length) (Math.Max(ret, length + prevLength))
            else
                longestSubarray' t (start, length) (Math.Max(ret, length))

    let len = List.length nums
    let pairs = collectOnes nums 0 None []

    match pairs with
    | [] -> 0
    | (_, length) :: [] -> if len = length then len - 1 else length
    | prev :: t -> longestSubarray' t prev 0