滑动窗口:
- 思路:类似于快慢指针,计算满足条件的子数组的长度(即fastIndex - slowIndex + 1),比较得出最小长度,最后输出最小长度;若整个数组没有子数组符合条件,则输出0。
- 动图解释:
- 实现步骤:
- 定义快慢指针为0;
- 当快慢指针指向的子数组数值之和小于target时,快指针往右移一位,不断循环判断,直到在不越界的情况下数值之和大于等于target;
- 当快慢指针指向的子数组数值之和大于等于target时,通过比较此时的子数组长度与最小长度并更新子数组最小长度;同时收缩左边界,并进行下一轮判断。
- 代码:
-
int minSubArrayLen(int target, int* nums, int numsSize){ //类似于快慢指针 int fastIndex = 0; int slowIndex = 0; int sum = 0; int minLen = numsSize + 1;//初始化子数组最小长度为父数组长度 + 1,作用是当没有子数组满足条件时,即最小长度仍为numsSize + 1时,作为判断条件返回0。 for(; fastIndex < numsSize; fastIndex ++){用快指针遍历原数组 sum += nums[fastIndex];//子数组之和加上快指针往右移一位后所指值 while(sum >= target){//当新的sum大于等于target时,即满足条件时,更新最小长度并收缩左边界 int indexLen = fastIndex - slowIndex + 1; if(indexLen < minLen) minLen = indexLen; sum -= nums[slowIndex ++]; } } if(minLen != numsSize + 1) return minLen;//若最小长度值与初始值不同,则说明存在满足条件的子数组,因此存在并返回子数组最小长度。 else return 0; }