题目要求连续子数组长度最小,且所给数组元素均为整数;
思路:
显然,我们需要维护一个数组(窗口):
则此数组一定具有的属性为数组和sum,对于目标值target和数组和sum,
sum<target时,需要加入新元素, 因为要求连续,新元素自然就是当前数组的后面相邻元素 sum>=target时,需要删除旧元素, 因为要求连续,旧元素自然是当前数组最前面的元素。
所以,很自然的想到需要两个指针,前面的指针用于删除元素,后面的指针用于加入元素。同时需要一个变量维护数组(窗口)的长度。
维护的数组称为滑动窗口,而滑动窗口是由快慢指针实现的。
细节:
当sum<target时,每加入一个元素需要进行一次判断sum<target;
当sum>=target时,维护最小长度后删除旧元素,在进行判断sum>=target;
代码如下:
class Solution { public: int minSubArrayLen(int target, vector<int>& nums) { int size=nums.size(); int s=0,f=0; int sum=0,len=INT_MAX; for(f;f<size;f++){ sum+=nums[f]; while(sum>=target){ len=(len<=f-s+1?len:f-s+1); sum-=nums[s++]; } } return (len==INT_MAX?0:len); } };