leetcode :209 题

需求:

给定一个正整数的数组,和一个target,找出数组中 子数组和大于等于 target的最小连续子数组。

示例 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

暴力解法:两层for循环。

双指针思路(滑动窗口思路):

C#:

public class Solution {
    public int MinSubArrayLen(int target, int[] nums) {
        int i=0;
        int sum=0;//用于统计子数组的和
        int result = nums.Length + 1;//用于记录最小字数组的长度
        for (int j=0;j<nums.Length;j++)
        {
            sum += nums[j];
            //如果字数组的和符合条件
            while(sum >= target)
            {
                int sublen = j - i + 1 ;//取当前符合条件的 [i,j] 区间
                result = min(result,sublen);//与前一个符合的区间比较取最小
                //移动左侧窗口
                sum -= nums[i++];
            }
        }
        return result == nums.Length +1 ? 0 :result;
    }
    public int min(int val1,int val2)
    {
        return val1 < val2? val1 :val2; 
    }
}

Rust:

impl Solution {
    pub fn min_sub_array_len(target: i32, nums: Vec<i32>) -> i32 {
        
        let mut i = 0;
        let mut sum = 0;
        let mut result = nums.len() + 1;
        for j in 0..nums.len()
        {
            sum += nums[j];
            while sum >= target
            {
                let subLen = j - i + 1;
                result = Solution::min(result,subLen);
                sum -= nums[i];
                i += 1;
            }
        }
        if result == nums.len() +1
        {
            return 0;
        }
        result as i32
    }
    pub fn min(val1:usize,val2:usize) -> usize
    {
        if val1 < val2
        {
            return val1;
        }
        val2
    }
}