From a4601fef467def32e091748f3161e6d0f09cce5c Mon Sep 17 00:00:00 2001 From: jackfiled Date: Tue, 18 Feb 2025 16:48:25 +0800 Subject: [PATCH] 20250218 finished. --- src/problem/mod.rs | 2 + src/problem/p2080_range_frequency_queries.rs | 85 ++++++++++++++++++++ 2 files changed, 87 insertions(+) create mode 100644 src/problem/p2080_range_frequency_queries.rs diff --git a/src/problem/mod.rs b/src/problem/mod.rs index 9a16d98..a8d26a3 100644 --- a/src/problem/mod.rs +++ b/src/problem/mod.rs @@ -490,3 +490,5 @@ mod p1552_magnetic_force_between_two_balls; mod p1706_where_will_the_ball_fall; mod p1299_replace_elements_with_greatest_element_on_right_side; + +mod p2080_range_frequency_queries; diff --git a/src/problem/p2080_range_frequency_queries.rs b/src/problem/p2080_range_frequency_queries.rs new file mode 100644 index 0000000..aa32b2a --- /dev/null +++ b/src/problem/p2080_range_frequency_queries.rs @@ -0,0 +1,85 @@ +/** + * [2080] Range Frequency Queries + */ +pub struct Solution {} + +// submission codes start here +use std::collections::HashMap; + +struct RangeFreqQuery { + frequency_map: HashMap>, +} + +/** + * `&self` means the method takes an immutable reference. + * If you need a mutable reference, change it to `&mut self` instead. + */ +impl RangeFreqQuery { + fn new(arr: Vec) -> Self { + let mut frequency_map = HashMap::new(); + + for (i, v) in arr.into_iter().enumerate() { + let entry = frequency_map.entry(v).or_insert(vec![]); + entry.push(i); + } + + Self { frequency_map } + } + + fn query(&self, left: i32, right: i32, value: i32) -> i32 { + let (left, right) = (left as usize, right as usize); + + if let Some(index) = self.frequency_map.get(&value) { + let l = index.binary_search(&left); + let r = index.binary_search(&right); + + let result = match l { + Ok(l_ok) => match r { + Ok(r_ok) => r_ok - l_ok + 1, + Err(r_err) => r_err - l_ok, + }, + Err(l_err) => match r { + Ok(r_ok) => r_ok - l_err + 1, + Err(r_err) => r_err - l_err, + }, + }; + + result as i32 + } else { + 0 + } + } +} + +/** + * Your RangeFreqQuery object will be instantiated and called as such: + * let obj = RangeFreqQuery::new(arr); + * let ret_1: i32 = obj.query(left, right, value); + */ + +// submission codes end + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_2080() { + let query = RangeFreqQuery::new(vec![12, 33, 4, 56, 22, 2, 34, 33, 22, 12, 34, 56]); + + assert_eq!(1, query.query(1, 2, 4)); + assert_eq!(2, query.query(0, 11, 33)); + + let query = RangeFreqQuery::new(vec![2, 2, 1, 2, 2]); + + // [2] + assert_eq!(1, query.query(2, 4, 1)); + assert_eq!(1, query.query(1, 3, 1)); + assert_eq!(1, query.query(0, 2, 1)); + + let query = RangeFreqQuery::new(vec![1, 1, 1, 2, 2]); + + // [0, 1, 2] + assert_eq!(1, query.query(2, 2, 1)); + } +}