LeetCode 2225. Find Players With Zero or One Losses in F#

URL

https://leetcode.com/problems/find-players-with-zero-or-one-losses/description/?envType=daily-question&envId=2024-01-15

Code

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

let winOrLose matches =
    let rec winOrLose' matches winner loser player =
        match matches with
        | [] -> winner, loser, Set.toList player |> List.sort
        | (win, lose) :: t ->
            let winner' =
                match Map.tryFind win winner with
                | Some(v) -> Map.add win (v + 1) winner
                | None -> Map.add win 1 winner

            let loser' =
                match Map.tryFind lose loser with
                | Some(v) -> Map.add lose (v + 1) loser
                | None -> Map.add lose 1 loser

            winOrLose' t winner' loser' (player |> Set.add win |> Set.add lose)

    winOrLose' matches Map.empty Map.empty Set.empty


let findWinners (matches: (int * int) list) : (int list * int list) =
    let rec findWinners' player winner loser notLost oneLose =
        match player with
        | [] -> List.rev notLost, List.rev oneLose
        | h :: t ->
            if Map.containsKey h winner && not <| Map.containsKey h loser then
                findWinners' t winner loser (h :: notLost) oneLose
            else
                let loses = Map.tryFind h loser |> Option.defaultValue 0

                if loses = 1 then
                    findWinners' t winner loser notLost (h :: oneLose)
                else
                    findWinners' t winner loser notLost oneLose

    let winner, loser, player = winOrLose matches
    findWinners' player winner loser [] []