209.长度最小的子数组(滑动窗口)

下面是不能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;
}
  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值