leetcode_rust/
minimum_size_subarray_sum.rs

1#![allow(dead_code)]
2
3// sliding window
4pub fn min_sub_array_len(s: i32, nums: Vec<i32>) -> i32 {
5    let mut i = 0;
6    let mut j = 0;
7    let mut sum = 0;
8    let mut count = nums.len() + 1;
9    loop {
10        let old_i = i;
11        let old_j = j;
12        if j < nums.len() && sum < s {
13            sum += nums[j];
14            j += 1;
15            continue;
16        }
17        if sum >= s && count > j - i {
18            count = j - i;
19        }
20        if sum >= s {
21            sum -= nums[i];
22            i += 1;
23        }
24        // no move
25        if old_i == i && old_j == j {
26            break;
27        }
28    }
29
30    if i == 0 {
31        0
32    } else {
33        count as i32
34    }
35}
36
37// other expression
38pub fn min_sub_array_len2(s: i32, nums: Vec<i32>) -> i32 {
39    if nums.len() < 1 {
40        return 0;
41    }
42
43    let mut i = 0;
44    let mut j = 0;
45    let mut sum = 0;
46    let mut count = nums.len() + 1;
47    while i < nums.len() {
48        if j < nums.len() && sum < s {
49            sum += nums[j];
50            j += 1;
51        } else {
52            sum -= nums[i];
53            i += 1;
54        }
55
56        if sum >= s {
57            count = count.min(j - i);
58        }
59    }
60
61    if count == nums.len() + 1 {
62        0
63    } else {
64        count as i32
65    }
66}
67
68#[cfg(test)]
69mod tests {
70    use super::*;
71
72    #[test]
73    fn test1() {
74        assert_eq!(min_sub_array_len(7, vec![2, 3, 1, 2, 4, 3]), 2);
75        assert_eq!(
76            min_sub_array_len(15, vec![5, 1, 3, 5, 10, 7, 4, 9, 2, 8]),
77            2
78        );
79        assert_eq!(min_sub_array_len(7, vec![3, 2, 1]), 0);
80        assert_eq!(min_sub_array_len(7, vec![]), 0);
81    }
82
83    #[test]
84    fn test2() {
85        assert_eq!(min_sub_array_len2(7, vec![2, 3, 1, 2, 4, 3]), 2);
86        assert_eq!(
87            min_sub_array_len2(15, vec![5, 1, 3, 5, 10, 7, 4, 9, 2, 8]),
88            2
89        );
90        assert_eq!(min_sub_array_len2(7, vec![3, 2, 1]), 0);
91        assert_eq!(min_sub_array_len2(7, vec![]), 0);
92    }
93}