Skip to content

Commit 6a80e7f

Browse files
committed
Added Insert Delete GetRandom O(1)
1 parent 37d660f commit 6a80e7f

File tree

3 files changed

+115
-0
lines changed

3 files changed

+115
-0
lines changed

Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,4 @@ edition = "2021"
66
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
77

88
[dependencies]
9+
rand = "0.7.2"

src/insert_delete_getrandom_o1.rs

+112
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
use rand::prelude::*;
2+
use std::collections::HashMap;
3+
4+
/// Implement the `RandomizedSet` class:
5+
///
6+
/// * `RandomizedSet()` Initializes the `RandomizedSet` object.
7+
///
8+
/// * `bool insert(int val)` Inserts an item `val` into the set if not present.
9+
/// Returns `true` if the item was not present, `false` otherwise.
10+
///
11+
/// * `bool remove(int val)` Removes an item `val` from the set if present.
12+
/// Returns `true` if the item was present, `false` otherwise.
13+
///
14+
/// * `int getRandom()` Returns a random element from the current set of
15+
/// elements (it's guaranteed that at least one element exists when the
16+
/// method is called). Each element must have the same probability of being
17+
/// returned.
18+
///
19+
/// You must implement the functions of the class such that each function works
20+
/// in average `O(1)` time complexity.
21+
struct RandomizedSet {
22+
items: Vec<i32>,
23+
indices: HashMap<i32, usize>
24+
}
25+
26+
impl RandomizedSet {
27+
28+
fn new() -> Self {
29+
Self { items: Vec::new(), indices: HashMap::new() }
30+
}
31+
32+
fn insert(&mut self, val: i32) -> bool {
33+
if !self.indices.contains_key(&val) {
34+
let index = self.items.len();
35+
self.items.push(val);
36+
self.indices.insert(val, index);
37+
true
38+
} else { false }
39+
}
40+
41+
fn remove(&mut self, val: i32) -> bool {
42+
if self.indices.contains_key(&val) {
43+
let n = self.items.len();
44+
if n == 1 {
45+
self.indices.clear();
46+
self.items.clear();
47+
} else {
48+
let index = self.indices[&val];
49+
if index == n-1 {
50+
self.items.pop();
51+
self.indices.remove(&val);
52+
} else {
53+
self.items.swap_remove(index);
54+
self.indices.remove(&val);
55+
let value_at_index = self.items[index];
56+
self.indices.insert(value_at_index, index);
57+
}
58+
}
59+
true
60+
} else { false }
61+
}
62+
63+
fn get_random(&self) -> i32 {
64+
let n = self.items.len();
65+
let mut rng = rand::thread_rng();
66+
let index = rng.gen_range(0,n);
67+
self.items[index]
68+
}
69+
70+
}
71+
72+
#[cfg(test)]
73+
mod tests {
74+
use super::RandomizedSet;
75+
76+
#[test]
77+
fn example_1() {
78+
let mut set = RandomizedSet::new();
79+
let result = set.insert(1);
80+
assert!(result);
81+
let result = set.remove(2);
82+
assert!(!result);
83+
let result = set.insert(2);
84+
assert!(result);
85+
let result = set.get_random();
86+
assert!(result == 1 || result == 2);
87+
let result = set.remove(1);
88+
assert!(result);
89+
let result = set.insert(2);
90+
assert!(!result);
91+
let result = set.get_random();
92+
assert_eq!(result, 2);
93+
}
94+
95+
#[test]
96+
fn real_world_1() {
97+
let mut set = RandomizedSet::new();
98+
let result = set.remove(0);
99+
assert!(!result);
100+
let result = set.remove(0);
101+
assert!(!result);
102+
let result = set.insert(0);
103+
assert!(result);
104+
let result = set.get_random();
105+
assert_eq!(result, 0);
106+
let result = set.remove(0);
107+
assert!(result);
108+
let result = set.insert(0);
109+
assert!(result);
110+
}
111+
112+
}

src/lib.rs

+2
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,8 @@ pub mod intersection_of_two_arrays_ii; // 350
149149

150150
pub mod kth_smallest_element_in_a_sorted_matrix; // 378
151151

152+
pub mod insert_delete_getrandom_o1; // 380 ✓
153+
152154
pub mod ransom_note; // 383
153155

154156
pub mod first_unique_character_in_a_string;

0 commit comments

Comments
 (0)