From 49652e8d4843ee517f695d73d5d151fa413fbba9 Mon Sep 17 00:00:00 2001 From: EFanZh Date: Wed, 20 Dec 2023 18:39:38 +0800 Subject: [PATCH] Add problem 2012: Sum of Beauty in the Array --- src/lib.rs | 1 + .../iterative.rs | 58 +++++++++++++++++++ .../mod.rs | 18 ++++++ 3 files changed, 77 insertions(+) create mode 100644 src/problem_2012_sum_of_beauty_in_the_array/iterative.rs create mode 100644 src/problem_2012_sum_of_beauty_in_the_array/mod.rs diff --git a/src/lib.rs b/src/lib.rs index 3cf0f589..211ac327 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1392,6 +1392,7 @@ pub mod problem_2000_reverse_prefix_of_word; pub mod problem_2006_count_number_of_pairs_with_absolute_difference_k; pub mod problem_2007_find_original_array_from_doubled_array; pub mod problem_2011_final_value_of_variable_after_performing_operations; +pub mod problem_2012_sum_of_beauty_in_the_array; #[cfg(test)] mod test_utilities; diff --git a/src/problem_2012_sum_of_beauty_in_the_array/iterative.rs b/src/problem_2012_sum_of_beauty_in_the_array/iterative.rs new file mode 100644 index 00000000..4e57ca90 --- /dev/null +++ b/src/problem_2012_sum_of_beauty_in_the_array/iterative.rs @@ -0,0 +1,58 @@ +pub struct Solution; + +// ------------------------------------------------------ snip ------------------------------------------------------ // + +impl Solution { + pub fn sum_of_beauties(nums: Vec) -> i32 { + let iter_1 = nums.iter().copied(); + let mut iter_2 = iter_1.clone(); + + iter_2.next(); + + let mut iter_3 = iter_2.clone(); + + iter_3.next(); + + // Calculate right maxes. + + let mut right_mins = vec![0; nums.len() - 2]; + let mut right_min = i32::MAX; + + for (target, num) in right_mins.iter_mut().zip(iter_3.clone()).rev() { + right_min = right_min.min(num); + *target = right_min; + } + + let mut result = 0; + + let mut left_max = i32::MIN; + + for (((left, middle), right), right_min) in iter_1.zip(iter_2).zip(iter_3).zip(right_mins) { + left_max = left_max.max(left); + + if left_max < middle && middle < right_min { + result += 2; + } else if left < middle && middle < right { + result += 1; + } + } + + result + } +} + +// ------------------------------------------------------ snip ------------------------------------------------------ // + +impl super::Solution for Solution { + fn sum_of_beauties(nums: Vec) -> i32 { + Self::sum_of_beauties(nums) + } +} + +#[cfg(test)] +mod tests { + #[test] + fn test_solution() { + super::super::tests::run::(); + } +} diff --git a/src/problem_2012_sum_of_beauty_in_the_array/mod.rs b/src/problem_2012_sum_of_beauty_in_the_array/mod.rs new file mode 100644 index 00000000..b619c1d8 --- /dev/null +++ b/src/problem_2012_sum_of_beauty_in_the_array/mod.rs @@ -0,0 +1,18 @@ +pub mod iterative; + +pub trait Solution { + fn sum_of_beauties(nums: Vec) -> i32; +} + +#[cfg(test)] +mod tests { + use super::Solution; + + pub fn run() { + let test_cases = [(&[1, 2, 3] as &[_], 2), (&[2, 4, 6, 4], 1), (&[3, 2, 1], 0)]; + + for (nums, expected) in test_cases { + assert_eq!(S::sum_of_beauties(nums.to_vec()), expected); + } + } +}