Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions DIRECTORY.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
2 changes: 2 additions & 0 deletions src/general/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
77 changes: 77 additions & 0 deletions src/general/subarray_sum_equals_k.rs
Original file line number Diff line number Diff line change
@@ -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<i64, i32> = 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);
}
}