1.滑动窗口
维护一个和sum>=s的滑动窗口
首先确定滑动窗口内的元素,然后修改滑动窗口的值,需要注意的是在第一次确定滑动窗口时,可能会直接把数组内所有元素包含进行
代码如下:
class Solution {
public:
int minSubArrayLen(int s, vector<int>& nums) {
int len=nums.size();
int sum=0;
int i=0;
while(sum<s&&i<len)
sum+=nums[i++];
if(sum<s&&i==len)//数组元素和小于s
return 0;
int start=0;
int num=i-start;
if(i==len)//如果所有元素加进行才满足初始窗口的需要,如11 1,2,3,4,5这种情况
{
while(sum>=s)//窗口右边界不变,左边界右移
{
sum-=nums[start];
if(sum>=s)
num=i-start-1;
start++;
}
}
for(int j=i;j<len;j++)
{
sum-=nums[start];
sum+=nums[j];//更新滑动窗口的值,左右边界都右移
start++;
while(sum>=s)
sum-=nums[start++];
start--;
sum+=nums[start];
num=min(num,j-start+1);
}
return num;
}
};
2.简化一下
上面的代码太多,不清晰
修改如下:
class Solution {
public:
int minSubArrayLen(int s, vector<int>& nums) {
int num=0;//保存最终的结果
int sum=0;//滑动窗口内元素的和
int left=0;//滑动窗口内最左边的元素
//right指向滑动窗口内最右边的元素
for(int right=0;right<nums.size();right++)
{
sum+=nums[right];
while(sum>=s)
{
num=num==0?right-left+1:min(num,right-left+1);
sum-=nums[left++];
}
}
return num;
}
};
3.二分查找