209.长度最小的子数组

题目

链接:leetcode链接
在这里插入图片描述

思路分析(滑动窗口)

1、为什么会想到使用滑动窗口呢?

首先,子数组是连续的,第二,所有的元素都是正整数,所以子数组的和具有单调性。
所以,对这个和的研究可以想到滑动窗口。

2、怎么使用滑动窗口?

使用滑动窗口一般有以下步骤。
进窗口,判断,出窗口,以及更新结果,更新结果的步骤根据不同的情景有不同的变化,前三个步骤一般都会有。

3、这个题怎么使用滑动窗口

首先,定义left和right指针,都从0位置开始。
随着left和right的移动,left和right之间就夹出了窗口。这也就是滑动窗口名字的由来(形象生动)

我们再设置一个sum变量,来统计窗口之间的和的大小。

在left和right的移动过程中,会出现一下两种情况:
1、sum < target。(判断)
说明和太小了,需要继续扩大窗口,于是right++,继续处理(进窗口)
2、sum >= target(判断)
和的大小达到了要求,这时候就需要去寻找最小的窗口。
可以通过++left来缩小窗口(出窗口),直到sum < target。
在每一次符合要求的窗口中寻找最小的窗口即可。(更新结果)

在这里插入图片描述

代码

int minSubArrayLen(int target, vector<int>& nums) {
        
        int sum = 0,len = INT_MAX;

        for(int left = 0,right = 0;right < nums.size();++right)
        {
            sum += nums[right];//进窗口
            
            while(sum >= target)//判断
            {
                len = min(len,right - left + 1);//更新结果
                sum -= nums[left];//出窗口
                ++left;
            }
            
        }

        return len == INT_MAX?0:len;
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值