
代码演示
class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int result = INT_MAX; // 用于存储最小子数组的长度
        int sum = 0;          // 滑动窗口的长度
        int i = 0;            // 滑动窗口的起始位置
        int sumlength = 0;    // 当前子数组的长度
        // 遍历数组
        for (int j = 0; j < nums.size(); j++) {
            sum += nums[j]; // 扩展窗口
            // 检查和是否大于等于目标值
            while (sum >= target) {
                sumlength = j - i + 1; // 计算当前子数组的长度
                result = result < sumlength ? result : sumlength; // 更新最小长度
                sum -= nums[i]; // 收缩窗口
                i++;            // 移动窗口的起始位置
            }
        }
        return result == INT_MAX ? 0 : result;
    }
};
思路
所谓滑动窗口,就是不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果。
初始化:
result初始化为INT_MAX,用于存储最小子数组的长度。
sum是滑动窗口中元素的当前和。
i是滑动窗口的起始位置。
sumlength是当前子数组的长度。
遍历数组:
- 外部循环 (
for (int j = 0; j < nums.size(); j++)) 遍历数组的每个元素。
sum += nums[j];:将当前元素添加到滑动窗口的和中。
检查和是否大于等于目标值:
- 如果
sum变得大于或等于target,表示当前窗口的和足够大。- 进入内部的
while循环来收缩窗口。
收缩窗口:
sumlength = j - i + 1;:计算当前子数组的长度。
result = result < sumlength ? result : sumlength;:用目前的最小长度更新result。
sum -= nums[i];:从和中减去起始位置的元素。
i++;:将窗口的起始位置向右移动。
返回结果:
- 循环结束后,如果
result已经被更新,则返回result,否则返回 0。



















