复刷滑动窗口209.长度最小的子数组

原题链接:滑动窗口209.长度最小的子数组

注释代码里写的很清楚了 主要讲解下思路:

这种最小子数组可称为滑动窗口 思路中的最小子数组也可都替换为滑动窗口

需要有一个sum对滑动窗口的总值进行存储,需要一个i存储滑动窗口最左边的下标,需要j存储最右边的下标,需要一个min_len存储长度最小的滑动窗口的长度
一旦滑动窗口的总值大于给定的target时,就需要进行判断。滑动窗口的长度(len = j - i + 1)是否是长度最小的 滑动窗口,如果是,则存储这个最小长度(min_len = min(len,min_len)),然后最小子数组左侧缩小一位(sum -= nums[i]),使其小于target,如果还是不小于 则再进行判断是否是长度最小的子数组,直到sum不大于target为止
如果sum不大于target时,就进行sum += nums[j],也就是最小子数组向右增加一位

全代码:

class Solution {
public:
    int minSubArrayLen(int s, vector<int>& nums) {
        int i = 0;//滑动窗口左侧起始位置
        int sum = 0;//滑动窗口长度总和  
        int len = 0;//滑动窗口长度
        int min_len = INT32_MAX;//最小滑动窗口(连续子数组)的长度
        for(int j = 0; j < nums.size(); j++)
        {
            //不大于s(也就是target)的情况下,滑动窗口向右边移动一位 也就是sum += nums[j];
            sum += nums[j];
            while(sum >=s)//在滑动窗口值大于sum总和时,进行长度判断,并左侧缩小滑动窗口的总和以及长度
            {
                //1.判断之前先获得滑动窗口的长度
                len = j - i + 1;
                //2.判断滑动窗口长度是否为最小的滑动窗口(滑动子数组)
                min_len = min(len,min_len);
                //3.不论是否最小,滑动窗口左侧都需要缩小一位,也就是i++
                sum -= nums[i++];
                //sum -= nums[i++];的意思是执行完sum -= nums[i]后 i++
            }
        }
        //判断min_len是否又被赋值过 没有则返回0,有则返回最小长度
        return min_len == INT32_MAX ? 0 : min_len;

    }
};

你可能感兴趣的:(算法)