求满足target的最小窗口的长度,滑动窗口法,双指针
class Solution {
public:int minSubArrayLen(int s, vector<int>& nums) {// 初始化结果为正无穷int result = INT32_MAX;// 滑动窗口的和int sum = 0;// 滑动窗口的起始位置int i = 0;// 滑动窗口的长度int subLength = 0;// 遍历数组,j是滑动窗口的结束位置for (int j = 0; j < nums.size(); j++) {// 累加当前元素到窗口和sum += nums[j];// 当窗口和大于等于目标值时while (sum >= s) {// 计算当前窗口长度subLength = (j - i + 1);// 更新最小长度result = result < subLength ? result : subLength;// 移动窗口起始位置,并减去对应的值sum -= nums[i++];}}// 如果没有找到符合条件的子数组,返回0return result == INT32_MAX ? 0 : result;}
};
其中
sum -= nums[i++]:
- 移动窗口左边界
- 从sum中减去左边界元素的值
- i++表示左边界向右移动一位
等价于:
sum -= nums[i]; // 先使用i的值
i = i + 1; // 然后i加1