From 5ef7b3d565d63eb34b1a1b001dc5f008977d2a7a Mon Sep 17 00:00:00 2001 From: MNnazrul Date: Mon, 17 Nov 2025 10:20:39 +0600 Subject: [PATCH] feat: add subarray sum equals k algorithm --- DIRECTORY.md | 1 + src/general/mod.rs | 2 + src/general/subarray_sum_equals_k.rs | 77 ++++++++++++++++++++++++++++ 3 files changed, 80 insertions(+) create mode 100644 src/general/subarray_sum_equals_k.rs diff --git a/DIRECTORY.md b/DIRECTORY.md index 46bb2a3af9f..b9922445e04 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -128,6 +128,7 @@ * [Heap](https://github.com/TheAlgorithms/Rust/blob/master/src/general/permutations/heap.rs) * [Naive](https://github.com/TheAlgorithms/Rust/blob/master/src/general/permutations/naive.rs) * [Steinhaus Johnson Trotter](https://github.com/TheAlgorithms/Rust/blob/master/src/general/permutations/steinhaus_johnson_trotter.rs) + * [Subarray Sum Equals K](https://github.com/TheAlgorithms/Rust/blob/master/src/general/subarray_sum_equals_k.rs) * [Two Sum](https://github.com/TheAlgorithms/Rust/blob/master/src/general/two_sum.rs) * Geometry * [Closest Points](https://github.com/TheAlgorithms/Rust/blob/master/src/geometry/closest_points.rs) diff --git a/src/general/mod.rs b/src/general/mod.rs index 3572b146f4a..4b51227d557 100644 --- a/src/general/mod.rs +++ b/src/general/mod.rs @@ -7,6 +7,7 @@ mod kadane_algorithm; mod kmeans; mod mex; mod permutations; +mod subarray_sum_equals_k; mod two_sum; pub use self::convex_hull::convex_hull_graham; @@ -22,4 +23,5 @@ pub use self::mex::mex_using_sort; pub use self::permutations::{ heap_permute, permute, permute_unique, steinhaus_johnson_trotter_permute, }; +pub use self::subarray_sum_equals_k::subarray_sum_equals_k; pub use self::two_sum::two_sum; diff --git a/src/general/subarray_sum_equals_k.rs b/src/general/subarray_sum_equals_k.rs new file mode 100644 index 00000000000..927e253d9a0 --- /dev/null +++ b/src/general/subarray_sum_equals_k.rs @@ -0,0 +1,77 @@ +use std::collections::HashMap; + +/// Counts the number of contiguous subarrays that sum to exactly k. +/// +/// # Parameters +/// +/// - `nums`: A slice of integers +/// - `k`: The target sum +/// +/// # Returns +/// +/// The number of contiguous subarrays with sum equal to k. +/// +/// # Complexity +/// +/// - Time: O(n) +/// - Space: O(n) + +pub fn subarray_sum_equals_k(nums: &[i32], k: i32) -> i32 { + let mut prefix_sum_count: HashMap = HashMap::new(); + prefix_sum_count.insert(0, 1); + + let mut prefix_sum: i64 = 0; + let mut count = 0; + + for &num in nums { + prefix_sum += num as i64; + let target = prefix_sum - k as i64; + + if let Some(&freq) = prefix_sum_count.get(&target) { + count += freq; + } + + *prefix_sum_count.entry(prefix_sum).or_insert(0) += 1; + } + + count +} + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn test_basic() { + assert_eq!(subarray_sum_equals_k(&[1, 1, 1], 2), 2); + assert_eq!(subarray_sum_equals_k(&[1, 2, 3], 3), 2); + } + + #[test] + fn test_single_element() { + assert_eq!(subarray_sum_equals_k(&[1], 1), 1); + assert_eq!(subarray_sum_equals_k(&[1], 0), 0); + } + + #[test] + fn test_empty() { + assert_eq!(subarray_sum_equals_k(&[], 0), 0); + assert_eq!(subarray_sum_equals_k(&[], 5), 0); + } + + #[test] + fn test_negative_numbers() { + assert_eq!(subarray_sum_equals_k(&[-1, -1, 1], 0), 1); + assert_eq!(subarray_sum_equals_k(&[1, -1, 0], 0), 3); + } + + #[test] + fn test_no_match() { + assert_eq!(subarray_sum_equals_k(&[1, 2, 3], 10), 0); + } + + #[test] + fn test_multiple_matches() { + assert_eq!(subarray_sum_equals_k(&[1, 0, 1, 0, 1], 1), 8); + } +}