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:
parent
70b56f4501
commit
3d2785b7d3
@ -58,11 +58,8 @@ impl Range {
|
||||
fn contains(&self, n: usize) -> bool {
|
||||
n >= self.lower && n <= self.upper
|
||||
}
|
||||
fn extend(&self, upper: usize) -> Range {
|
||||
Range {
|
||||
lower: self.lower,
|
||||
upper: self.upper.max(upper),
|
||||
}
|
||||
fn extend(&mut self, upper: usize) {
|
||||
self.upper = upper
|
||||
}
|
||||
}
|
||||
|
||||
@ -72,16 +69,13 @@ impl Ranges {
|
||||
Ranges(Vec::new())
|
||||
}
|
||||
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);
|
||||
} 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 {
|
||||
self.0.iter().map(|r| r.length()).sum()
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user