pub fn kadane(arr: &[i32]) -> Option<i32> {
if arr.is_empty() {
return None;
}
let mut current_sum = arr[0];
let mut max_sum = arr[0];
for &val in &arr[1..] {
current_sum = current_sum.max(0) + val;
max_sum = max_sum.max(current_sum);
}
Some(max_sum)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_empty_array() {
let arr: [i32; 0] = [];
assert_eq!(kadane(&arr), None, "Empty array should return None");
}
#[test]
fn test_single_element() {
let arr = [42];
assert_eq!(
kadane(&arr),
Some(42),
"Single-element array should return that element"
);
}
#[test]
fn test_all_negative() {
let arr = [-8, -3, -6, -2, -5, -4];
assert_eq!(kadane(&arr), Some(-2));
}
#[test]
fn test_mixed_values() {
let arr = [1, -2, 3, 5, -1];
assert_eq!(kadane(&arr), Some(8));
}
#[test]
fn test_large_positive() {
let arr = [2, 2, 2, 2, 2];
assert_eq!(kadane(&arr), Some(10));
}
#[test]
fn test_subarray_in_the_middle() {
let arr = [-1, -2, 4, 5, -1, -2];
assert_eq!(kadane(&arr), Some(9));
}
#[test]
fn test_subarray_at_the_end() {
let arr = [-5, -1, 2, 3, 7];
assert_eq!(kadane(&arr), Some(12));
}
#[test]
fn test_large_fluctuations() {
let arr = [10, -5, 2, -1, 15, -20, 25, -2];
assert_eq!(kadane(&arr), Some(26));
}
}