算法day4 长度最小的子数组|滑动窗口

题目描述

思路:双指针
对于这样的一个正整数数组,我们可以设置两个指针i,j来控制滑动窗口的长度(即本题中子数组的长度),设置一个sum来计算当前窗口内的元素的和,window_length来记录当前的最小窗口的长度。我们以i作为窗口的起始,j指针在循环中生长。通过循环计算sum的值与target进行比较,若大于等于,则要收缩窗口,收缩的方式是对窗口起始指针i进行自增。计算对应的窗口长度与原本的窗口长度进行比较更新,并将被窗口抛出的部分的元素的值从sum中减去。最后返回window_length。

代码如下

   int minSubArrayLen(int target, vector<int>& nums) {
    int sum = 0;
    int window_length = INT_MAX;  //window_length的初始化不能用nums.size(),会有部分样例不通过,INT_MAX表示最大整型
    int len = nums.size();
    int i = 0;
    int subl;
    for(int j =0;j<len;j++){
        sum += nums[j];
        while(sum >= target){//这里收缩要用while
            subl = j-i+1;
            window_length = min(window_length,subl);
            sum =sum - nums[i];
            i++;
        }
   
    }
    return window_length = window_length == INT_MAX ? 0 : window_length;
}

时间复杂度:O(n)
空间复杂度:O(1)

END

posted on 2025-04-06 20:26  sakura430  阅读(13)  评论(0)    收藏  举报