代码演示
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。