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}