209. 长度最小的子数组 ★★
力扣题目链接,给定一个含有 n
个正整数的数组和一个正整数 target
。找出该数组中满足其总和大于等于 target
的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr]
,并返回其长度**。**如果不存在符合条件的子数组,返回 0
。
1 <= target <= 109
1 <= nums.length <= 105
1 <= nums[i] <= 105
示例 1:
输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。
示例 2:
输入:target = 4, nums = [1,4,4]
输出:1
示例 3:
输入:target = 11, nums = [1,1,1,1,1,1,1,1]
输出:0
本地练习
pub struct Solution;
impl Solution {
pub fn min_sub_array_len(target: i32, nums: Vec<i32>) -> i32 {
}
}
fn main() {
let res = [(7, vec![2, 3, 1, 2, 4, 3]), (4, vec![1, 4, 4]), (11, vec![1, 1, 1, 1, 1, 1, 1, 1])]
.iter().map(|x| Solution::min_sub_array_len(x.0, x.1.to_vec())).collect::<Vec<_>>();
println!("{:?}: {:?}", vec![2, 1, 0] == res, res);
}
Rust答案
impl Solution {
pub fn min_sub_array_len(target: i32, nums: Vec<i32>) -> i32 {
let (mut sum, mut i, mut result) = (0, 0, i32::MAX);
for (pos, val) in nums.iter().enumerate() {
sum += val;
while sum >= target {
result = result.min((pos - i + 1) as i32);
sum -= nums[i];
i += 1;
}
}
if result == i32::MAX {
return 0;
}
result
}
}