Skip to content

Commit cfa131b

Browse files
authored
Add Minimum Excluded Element (TheAlgorithms#404)
1 parent 5f05448 commit cfa131b

File tree

2 files changed

+82
-1
lines changed

2 files changed

+82
-1
lines changed

src/general/mex.rs

+79
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
use std::collections::BTreeSet;
2+
3+
// Find minimum excluded number from a set of given numbers using a set
4+
/// Finds the MEX of the values provided in `arr`
5+
/// Uses [`BTreeSet`](std::collections::BTreeSet)
6+
/// O(nlog(n)) implementation
7+
pub fn mex_using_set(arr: &[i64]) -> i64 {
8+
let mut s: BTreeSet<i64> = BTreeSet::new();
9+
for i in 0..arr.len() + 1 {
10+
s.insert(i as i64);
11+
}
12+
for x in arr {
13+
s.remove(x);
14+
}
15+
// TODO: change the next 10 lines to *s.first().unwrap() when merged into stable
16+
// set should never have 0 elements
17+
if let Some(x) = s.into_iter().next() {
18+
x
19+
} else {
20+
panic!("Some unknown error in mex_using_set")
21+
}
22+
}
23+
/// Finds the MEX of the values provided in `arr`
24+
/// Uses sorting
25+
/// O(nlog(n)) implementation
26+
pub fn mex_using_sort(arr: &[i64]) -> i64 {
27+
let mut arr = arr.to_vec();
28+
arr.sort();
29+
let mut mex = 0;
30+
for x in arr {
31+
if x == mex {
32+
mex += 1;
33+
}
34+
}
35+
mex
36+
}
37+
38+
#[cfg(test)]
39+
mod tests {
40+
use super::*;
41+
struct MexTests {
42+
test_arrays: Vec<Vec<i64>>,
43+
outputs: Vec<i64>,
44+
}
45+
impl MexTests {
46+
fn new() -> Self {
47+
return Self {
48+
test_arrays: vec![
49+
vec![-1, 0, 1, 2, 3],
50+
vec![-100, 0, 1, 2, 3, 5],
51+
vec![-1000000, 0, 1, 2, 5],
52+
vec![2, 0, 1, 2, 4],
53+
vec![1, 2, 3, 0, 4],
54+
vec![0, 1, 5, 2, 4, 3],
55+
vec![0, 1, 2, 3, 4, 5, 6],
56+
vec![0, 1, 2, 3, 4, 5, 6, 7],
57+
vec![0, 1, 2, 3, 4, 5, 6, 7, 8],
58+
],
59+
outputs: vec![4, 4, 3, 3, 5, 6, 7, 8, 9],
60+
};
61+
}
62+
fn test_function(&self, f: fn(&[i64]) -> i64) {
63+
for (nums, output) in self.test_arrays.iter().zip(self.outputs.iter()) {
64+
assert_eq!(f(nums), *output);
65+
}
66+
}
67+
}
68+
#[test]
69+
fn test_mex_using_set() {
70+
let tests = MexTests::new();
71+
mex_using_set(&[1, 23, 3]);
72+
tests.test_function(mex_using_set);
73+
}
74+
#[test]
75+
fn test_mex_using_sort() {
76+
let tests = MexTests::new();
77+
tests.test_function(mex_using_sort);
78+
}
79+
}

src/general/mod.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,16 @@ mod fisher_yates_shuffle;
33
mod hanoi;
44
mod huffman_encoding;
55
mod kmeans;
6+
mod mex;
67
mod nqueens;
78
mod two_sum;
8-
99
pub use self::convex_hull::convex_hull_graham;
1010
pub use self::fisher_yates_shuffle::fisher_yates_shuffle;
1111
pub use self::hanoi::hanoi;
1212
pub use self::huffman_encoding::{HuffmanDictionary, HuffmanEncoding};
1313
pub use self::kmeans::f32::kmeans as kmeans_f32;
1414
pub use self::kmeans::f64::kmeans as kmeans_f64;
15+
pub use self::mex::mex_using_set;
16+
pub use self::mex::mex_using_sort;
1517
pub use self::nqueens::nqueens;
1618
pub use self::two_sum::two_sum;

0 commit comments

Comments
 (0)