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
如果这篇文章对您有帮助,可以点个赞支持一下,感谢~