import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param target int整型 
     * @param nums int整型一维数组 
     * @return int整型
     */
        public int findMinSubarrayLength (int target, int[] nums) {
		  // fast快指针每次必+1遍历全部nums数组
        int fast = 0;
		  // 慢指针slow用于在sum>target的情况下进行缩减,缩容
        int slow = 0;
		  // sum用于子数组求和是否大于target
        int sum = 0;
		  // pos用于记录连续牛群的长度,这里赋值给nums.length+1相当于一个Integer.MAXValue,赋值一个较大值
		  // 而pos最多是什么呢?比如nums.length也就是整个数组的长度刚好满足sum>target的条件
		  // 利用nums.length+1可以判断pos是否被赋值过,可以看结尾的return 会更好理解 ,如果<nums.length+1说明被赋值过,有更小的连续牛群长度,返回pos,否则返回0表示找不到连续牛群>target的长度
        int pos = nums.length + 1;
		  // fast用于遍历求和
        for (; fast < nums.length; fast++) {
		  // 每次必+nums[fast]
            sum += nums[fast];
		  // 什么时候进行缩容?当然是sum>=target的时候
            if (sum >= target) {
			  // 用while(true)进行持续的缩容
                while (true) {
				  // 判断缩容后是否大于target 如果还大于那么减取nums[slow]然后继续缩容
                    if (sum - nums[slow] >= target) {
                        sum = sum - nums[slow];
                        slow++;
					  // 如果缩容后不能大于target,直接退出
                    } else {
                        break;
                    }
                }
			  // fast-slow+1就是连续牛群的长度,判断是否小于pos,小于就进行赋值,可以用Math.min替换
                if (fast - slow + 1 < pos) {
                    pos = fast - slow + 1;
                }
            }
        }
		  // 根据是否被赋值判断有没有满足条件的连续牛群
        return (pos< nums.length+1)?pos:0;
    }
}

本题知识点分析:

1.滑动窗口

2.双指针

3.数组遍历

4.数学模拟

本题解题思路分析:

1.快指针进行求和

2.慢指针进行缩容

3.求的是连续牛群的长度

本题是双指针和滑动窗口的感觉,还是挺好做的。

本题使用编程语言: Java

如果这篇文章对您有帮助,可以点个赞支持一下,感谢~