Make Rust day 5 vector operations more efficient

We do more in-place and operate on the end of the vector to avoid quadratic complexity.
This commit is contained in:
George Thomas 2026-01-07 14:45:55 +00:00
parent 70b56f4501
commit 3d2785b7d3

View File

@ -58,11 +58,8 @@ impl Range {
fn contains(&self, n: usize) -> bool { fn contains(&self, n: usize) -> bool {
n >= self.lower && n <= self.upper n >= self.lower && n <= self.upper
} }
fn extend(&self, upper: usize) -> Range { fn extend(&mut self, upper: usize) {
Range { self.upper = upper
lower: self.lower,
upper: self.upper.max(upper),
}
} }
} }
@ -72,16 +69,13 @@ impl Ranges {
Ranges(Vec::new()) Ranges(Vec::new())
} }
fn add(&mut self, new: Range) { fn add(&mut self, new: Range) {
if self.0.is_empty() { if let Some(last) = self.0.last_mut() {
if last.contains(new.lower) {
last.extend(last.upper.max(new.upper));
return;
}
}
self.0.push(new); self.0.push(new);
} else {
let first = &self.0[0];
if first.contains(new.lower) {
self.0[0] = first.extend(new.upper);
} else {
self.0.insert(0, new);
}
}
} }
fn total_length(&self) -> usize { fn total_length(&self) -> usize {
self.0.iter().map(|r| r.length()).sum() self.0.iter().map(|r| r.length()).sum()