下面是不能AC的代码,超出了时间限制,呜呜呜呜呜呜,┭┮﹏┭┮
暴力不行,要想办法优化代码,下面引入滑动窗口
~~int minSubArrayLen(int target, int* nums, int numsSize) {
int length;
//这个暴力似乎也不对,似乎可以用俩循环就能完成了,而不用三个,一会儿再看
for(length=1;length<=numsSize;length++){
for(int i=0;i<=numsSize-length;i++){
int sum=0;
for(int j=i;j<i+length;j++){
sum=sum+nums[j];
//时间复杂度为o(n的3次方)
}
if(sum>=target)
return length;
}
}
return 0;
}~~
滑动窗口的思路来对暴力算法进行优化
滑动窗口思路:https://www.bilibili.com/video/BV14Q4y1P7Np/?spm_id_from=333.337.search-card.all.click&vd_source=4959d3983f6ed4f2a3b3be2f91b2e1fd
设置两个指针,左右最开始都在0,然后右边向右滑动,当满足条件时,然后判断一下是否需要更新最优解,并将左边界向右移动,看是否能满足条件,能的话然后判断一下是否需要更新最优解,不能的话就将右边界向右滑动,一直到能满足条件或者已经滑动到头了,还没有能满足了,自然就退出了。
209滑动窗口具体代码
int min(int a,int b){
if(a<=b)
return a;
else
return b;
}
int minSubArrayLen(int target, int* nums, int numsSize) {
int left=0,right=0;
int sum=0;
int ans=INT_MAX;
//这里不能自作聪明将ans设置为一个负数,因为一会儿会有一个比较操作,来输出比较小的那个值
// 如果整个负数,那么输出的一定是那个负数。
//INT_MAX和INT_MIN分别表示最大、最小整数,似乎可以直接用
for(right; right<numsSize; right++){
sum=sum+nums[right];
while(sum>=target){
//满足题目要求的条件了
int length=right-left+1;
//计算此时滑动窗口的长度
ans=min(ans,length);
//题目让求的是最小长度,所以来看看哪个比较小,来决定是否更新最后返回值的大小
sum=sum-nums[left];
//当窗口右移的时候,肯定要将右移之后窗口外的元素的值给删除掉,因此要减去nums[left]之后,再将窗口真正的右移。
left++;
}
}
if(ans==INT_MAX)
return 0;
//这里的选择结构也是不可少的,不能直接return ans,因为在失败的情况下要返回0
//如果没有这个返回结构,那么在失败的时候会返回INT_MAX所对应的值2147483647
else
return ans;
}