URL
https://leetcode.com/problems/design-a-number-container-system/description/?envType=daily-question&envId=2025-02-08
Code
#r "nuget:FSharpx.Collections"
open FSharpx.Collections
type NumberContainers =
{ numMap: Map<int, int>
indexMap: Map<int, IPriorityQueue<int>> }
static member empty =
{ numMap = Map.empty
indexMap = Map.empty }
static member change (index: int) (number: int) (nc: NumberContainers) : NumberContainers =
let numMap = Map.add index number nc.numMap
let q =
Map.tryFind number nc.indexMap
|> Option.defaultValue (PriorityQueue.empty false)
|> PriorityQueue.insert index
{ numMap = numMap
indexMap = Map.add number q nc.indexMap }
static member find (number: int) (nc: NumberContainers) : int * NumberContainers =
let rec f q =
match PriorityQueue.tryPop q with
| None ->
-1,
{ nc with
indexMap = Map.add number q nc.indexMap }
| Some((v, q')) ->
if Map.find v nc.numMap = number then
v,
{ nc with
indexMap = Map.add number q nc.indexMap }
else
f q'
match Map.tryFind number nc.indexMap with
| None -> -1, nc
| Some(q) -> f q