LeetCode 2007. Find Original Array From Doubled Array in F#
URL
leetcode.com/problems/find-original-array-f..
Code
github.com/syohex/dotnet-study/blob/master/..
let findOriginalArray (changed: int list) : int list =
let rec findOriginalArray' changed m len acc =
match changed with
| [] ->
if (List.length acc * 2) = len then
acc |> List.rev
else
[]
| h :: t ->
let count = Map.find h m
if count = 0 then
findOriginalArray' t m len acc
else
let m' = Map.add h (count - 1) m
let doubled = h * 2
match Map.tryFind doubled m' with
| None -> []
| Some (v) ->
if v = 0 then
[]
else
let m'' = Map.add doubled (v - 1) m'
findOriginalArray' t m'' len (h :: acc)
let len = List.length changed
let m =
changed
|> List.fold
(fun acc n ->
match Map.tryFind n acc with
| None -> Map.add n 1 acc
| Some (v) -> Map.add n (v + 1) acc)
Map.empty
findOriginalArray' (changed |> List.sort) m len []