Skip to content

Commit 2dc71a1

Browse files
committed
feat: add solution in rust for k closest points
1 parent e679abf commit 2dc71a1

File tree

1 file changed

+48
-0
lines changed

1 file changed

+48
-0
lines changed
+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
#![allow(dead_code)]
2+
use std::collections::BinaryHeap;
3+
4+
pub fn k_closest(points: Vec<Vec<i32>>, k: i32) -> Vec<Vec<i32>> {
5+
let k = k as usize;
6+
let mut pq = BinaryHeap::with_capacity(k);
7+
for p in &points {
8+
let d = p[0] * p[0] + p[1] * p[1];
9+
pq.push((d, vec![p[0], p[1]]));
10+
if pq.len() > k {
11+
pq.pop();
12+
}
13+
}
14+
pq.into_iter().map(|(_, p)| p).collect()
15+
}
16+
17+
#[cfg(test)]
18+
mod tests {
19+
use std::vec;
20+
21+
use super::*;
22+
23+
fn compare_vec_of_vecs(a: Vec<Vec<i32>>, b: Vec<Vec<i32>>) -> bool {
24+
let mut a = a;
25+
let mut b = b;
26+
a.sort();
27+
b.sort();
28+
a == b
29+
}
30+
31+
#[test]
32+
fn test_1() {
33+
let points = vec![vec![1, 3], vec![-2, 2]];
34+
let k = 1;
35+
let expected = vec![vec![-2, 2]];
36+
let result = k_closest(points, k);
37+
assert!(compare_vec_of_vecs(result, expected));
38+
}
39+
40+
#[test]
41+
fn test_2() {
42+
let points = vec![vec![3, 3], vec![5, -1], vec![-2, 4]];
43+
let k = 2;
44+
let expected = vec![vec![3, 3], vec![-2, 4]];
45+
let result = k_closest(points, k);
46+
assert!(compare_vec_of_vecs(result, expected));
47+
}
48+
}

0 commit comments

Comments
 (0)