max_subarray_sum/interface.rs
1pub struct Elements<'list> {
2 pub list: &'list [i32],
3 pub len: usize,
4 pub max_sum: Option<i32>,
5}
6
7impl<'list> Elements<'list> {
8 /// Returns a new instance of struct `Elements`.
9 pub fn new(list: &'list [i32]) -> Self {
10 Elements {
11 list,
12 len: list.len(),
13 max_sum: None,
14 }
15 }
16
17 /// This method finds the max subarray sum. If there are multiple
18 /// subarrays with equal sum it selects the subarray that came first.
19 pub fn find_max_sum(&mut self) -> &Self {
20 let list: &[i32] = self.list;
21
22 let len: usize = self.len;
23
24 let mut temp_sum: i32 = list[0];
25
26 let mut max_sum: i32 = temp_sum;
27
28 for i in 1..len {
29 if temp_sum > 0 {
30 temp_sum += list[i];
31 } else {
32 temp_sum = list[i];
33 }
34
35 if temp_sum > max_sum {
36 max_sum = temp_sum;
37 }
38 }
39
40 self.max_sum = Some(max_sum);
41
42 self
43 }
44
45 /// This method returns the max subarray sum. We need to chain
46 /// this method with `find_max_sum`.
47 ///
48 /// # Examples
49 /// ```
50 /// use max_subarray_sum::interface::Elements;
51 ///
52 /// let mut list = vec![-2, -3, 4, -1, -2, 1, 5, -3];
53 ///
54 /// let mut elements = Elements::new(&mut list);
55 ///
56 /// let max_sum = elements.find_max_sum().result();
57 ///
58 /// assert_eq!(7, max_sum);
59 /// ```
60 pub fn result(&self) -> i32 {
61 self.max_sum.unwrap()
62 }
63}