From 43d043b5e1530ce91ba7ed2314bfac3749e7ff6b Mon Sep 17 00:00:00 2001 From: Matej Focko Date: Sun, 16 Apr 2023 00:05:53 +0200 Subject: [PATCH] =?UTF-8?q?problems(rs):=20add=20=E2=80=9C303.=20Range=20S?= =?UTF-8?q?um=20Query=20-=20Immutable=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Matej Focko --- problems/range-sum-query-immutable.rs | 45 +++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 problems/range-sum-query-immutable.rs diff --git a/problems/range-sum-query-immutable.rs b/problems/range-sum-query-immutable.rs new file mode 100644 index 0000000..1aa4dd8 --- /dev/null +++ b/problems/range-sum-query-immutable.rs @@ -0,0 +1,45 @@ +#[derive(Debug)] +struct NumArray { + prefix_sums: Vec, +} + +impl NumArray { + fn new(nums: Vec) -> Self { + let mut total = nums.iter().sum::(); + + let mut prefix_sums: Vec = nums + .iter() + .scan(total, |total, &x| { + let prev = *total; + *total -= x; + + Some(prev) + }) + .collect(); + prefix_sums.push(0); + + Self { prefix_sums } + } + + fn sum_range(&self, left: i32, right: i32) -> i32 { + self.prefix_sums[left as usize] - self.prefix_sums[right as usize + 1] + } +} + +fn main() {} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn example_1() { + let num_arr = NumArray::new(vec![-2, 0, 3, -5, 2, -1]); + + dbg!("{:?}", &num_arr); + + assert_eq!(num_arr.sum_range(0, 2), 1); + assert_eq!(num_arr.sum_range(2, 5), -1); + assert_eq!(num_arr.sum_range(0, 5), -3); + } +}