feat: 2349_design_a_number_container_system
This commit is contained in:
parent
68cc571f02
commit
677ac9b9ff
7
2349_design_a_number_container_system/Cargo.lock
generated
Normal file
7
2349_design_a_number_container_system/Cargo.lock
generated
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
# This file is automatically @generated by Cargo.
|
||||||
|
# It is not intended for manual editing.
|
||||||
|
version = 4
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "design_a_number_container_system"
|
||||||
|
version = "0.1.0"
|
6
2349_design_a_number_container_system/Cargo.toml
Normal file
6
2349_design_a_number_container_system/Cargo.toml
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
[package]
|
||||||
|
name = "design_a_number_container_system"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2024"
|
||||||
|
|
||||||
|
[dependencies]
|
51
2349_design_a_number_container_system/src/lib.rs
Normal file
51
2349_design_a_number_container_system/src/lib.rs
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
use std::{
|
||||||
|
cmp::Reverse,
|
||||||
|
collections::{BinaryHeap, HashMap},
|
||||||
|
};
|
||||||
|
|
||||||
|
pub struct NumberContainers {
|
||||||
|
// k: idx, v: num
|
||||||
|
numbers: HashMap<i32, i32>,
|
||||||
|
|
||||||
|
// k: num, v: idxs
|
||||||
|
min_heaps: HashMap<i32, BinaryHeap<Reverse<i32>>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl NumberContainers {
|
||||||
|
pub fn new() -> Self {
|
||||||
|
Self {
|
||||||
|
numbers: HashMap::new(),
|
||||||
|
min_heaps: HashMap::new(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn change(&mut self, index: i32, number: i32) {
|
||||||
|
self.numbers.insert(index, number);
|
||||||
|
if let Some(heap) = self.min_heaps.get_mut(&number) {
|
||||||
|
heap.push(Reverse(index));
|
||||||
|
} else {
|
||||||
|
let mut heap = BinaryHeap::new();
|
||||||
|
heap.push(Reverse(index));
|
||||||
|
self.min_heaps.insert(number, heap);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn find(&mut self, number: i32) -> i32 {
|
||||||
|
let mut result = -1;
|
||||||
|
|
||||||
|
if let Some(heap) = self.min_heaps.get_mut(&number) {
|
||||||
|
while let Some(Reverse(smallest_index)) = heap.peek() {
|
||||||
|
if let Some(num_from_idx) = self.numbers.get(smallest_index)
|
||||||
|
&& num_from_idx == &number
|
||||||
|
{
|
||||||
|
result = *smallest_index;
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
heap.pop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
result
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user