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 [] []