LeetCode 373. Find K Pairs with Smallest Sums in F#
URL
Find K Pairs with Smallest Sums - LeetCode
Code
https://github.com/syohex/dotnet-study/tree/master/fsharp/leetcode/problems/0373/main.fsx
#r "nuget:FSharpx.Collections"
open FSharpx.Collections
let kSmallestPairs (nums1: int[]) (nums2: int[]) (k: int) : (int * int) list =
let rec kSmallestPairs' q (nums1: int[]) (nums2: int[]) k visited acc =
if k = 0 then
List.rev acc
else
match PriorityQueue.tryPop q with
| None -> List.rev acc
| Some((_, i, j), t) ->
let acc' = (nums1.[i], nums2.[j]) :: acc
let q', visited' =
if i + 1 < nums1.Length && (Set.contains (i + 1, j) visited |> not) then
PriorityQueue.insert (nums1.[i + 1] + nums2.[j], i + 1, j) t, Set.add (i + 1, j) visited
else
t, visited
let q'', visited'' =
if j + 1 < nums2.Length && (Set.contains (i, j + 1) visited |> not) then
PriorityQueue.insert (nums1.[i] + nums2.[j + 1], i, j + 1) q', Set.add (i, j + 1) visited
else
q', visited'
kSmallestPairs' q'' nums1 nums2 (k - 1) visited'' acc'
let q =
PriorityQueue.empty false |> PriorityQueue.insert (nums1.[0] + nums2.[0], 0, 0)
let visited = Set.empty |> Set.add (0, 0)
kSmallestPairs' q nums1 nums2 k visited []