leetcode_rust/
minimum_size_subarray_sum.rs1#![allow(dead_code)]
2
3pub 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 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
37pub 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}