Skip to content

Commit 3e6acb1

Browse files
committedOct 26, 2021
misc
1 parent 1dacc3b commit 3e6acb1

3 files changed

+63
-0
lines changed
 

‎find-k-pairs-with-smallest-sums.nim

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import std/heapqueue
2+
3+
type cintArray = ptr UncheckedArray[cint]
4+
5+
proc malloc(size: csize_t): pointer {.importc.}
6+
7+
proc kSmallestPairs(a: cintArray, m: int, b: cintArray, n: int, k0: int, returnSize: ptr cint, returnColumnSizes: ptr cintArray): ptr UncheckedArray[cintArray] {.exportc.} =
8+
let
9+
k = min(k0, m*n)
10+
sizes = cast[cintArray](malloc(cast[csize_t](cint.sizeof * k)))
11+
var
12+
h: HeapQueue[(cint, int32, int32)]
13+
for i in 0..<min(m, k):
14+
h.push (a[i]+b[0], cast[int32](i), 0'i32)
15+
result = cast[ptr UncheckedArray[cintArray]](malloc(cast[csize_t](pointer.sizeof * k)))
16+
returnSize[] = cast[cint](k)
17+
returnColumnSizes[] = sizes
18+
for i in 0..<k:
19+
let (x, p, q) = h.pop
20+
result[i] = cast[cintArray](malloc(cast[csize_t](cint.sizeof * 2)))
21+
result[i][0] = a[p]
22+
result[i][1] = b[q]
23+
sizes[i] = 2
24+
if q+1 < n:
25+
h.push (a[p]+b[q+1], p, q+1)

‎find-k-th-smallest-pair-distance.nim

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# Find K-th Smallest Pair Distance
2+
import std/algorithm
3+
4+
proc smallestDistancePair(nums: ptr UncheckedArray[cint], n: int, k: int): cint {.exportc.} =
5+
var a = newSeq[cint](n)
6+
for i in 0..<n: a[i] = nums[i]
7+
a.sort()
8+
var
9+
l: cint = 0
10+
h = a[^1]-a[0]
11+
while l < h:
12+
let m = (l+h) shr 1
13+
var
14+
i = 0
15+
c = 0
16+
for j in 0..<n:
17+
while a[j]-a[i] > m:
18+
inc i
19+
c += cast[int](j-i)
20+
if k <= c: h = m
21+
else: l = m+1
22+
l
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
proc kthSmallest(matrix: ptr UncheckedArray[ptr UncheckedArray[cint]], n: int, ms: ptr UncheckedArray[cint], k: int): int {.exportc.} =
2+
let m = ms[0]
3+
var
4+
l = matrix[0][0]
5+
h = matrix[n-1][m-1]
6+
while l < h:
7+
let x = l+(h-l) div 2
8+
var
9+
c = 0
10+
j = m
11+
for i in 0..<n:
12+
while j > 0 and x < matrix[i][j-1]: dec j
13+
c += j
14+
if c < k: l = x+1
15+
else: h = x
16+
l

0 commit comments

Comments
 (0)
Please sign in to comment.