LeetCode 659. Split Array into Consecutive Subsequences in F#
URL
leetcode.com/problems/split-array-into-cons..
Code
github.com/syohex/dotnet-study/blob/master/..
let isPossible (nums: int list) : bool =
let rec isPossible' nums freq seqs =
match nums with
| [] -> true
| h :: t ->
let count = Map.find h freq
if count = 0 then
isPossible' t freq seqs
else
let freq' = Map.add h (count - 1) freq
match Map.tryFind (h - 1) seqs with
| Some (v) when v > 0 ->
let seqs' = seqs |> Map.add (h - 1) (v - 1)
match Map.tryFind h seqs with
| Some (x) -> isPossible' t freq' (Map.add h (x + 1) seqs')
| None -> isPossible' t freq' (Map.add h 1 seqs')
| _ ->
match Map.tryFind (h + 1) freq', Map.tryFind (h + 2) freq' with
| Some (n1), Some (n2) when n1 > 0 && n2 > 0 ->
let freq'' =
freq'
|> Map.add (h + 1) (n1 - 1)
|> Map.add (h + 2) (n2 - 1)
match Map.tryFind (h + 2) seqs with
| Some (x) -> isPossible' t freq'' (Map.add (h + 2) (x + 1) seqs)
| None -> isPossible' t freq'' (Map.add (h + 2) 1 seqs)
| _, _ -> false
let freq =
nums
|> List.fold
(fun acc n ->
match Map.tryFind n acc with
| Some (v) -> Map.add n (v + 1) acc
| None -> Map.add n 1 acc)
Map.empty
isPossible' nums freq Map.empty