209. 长度最小的子数组

124 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

209. 长度最小的子数组

  • 题号:力扣209
  • 知识点:数组,滑动窗口
  • 总结 题干: 在这里插入图片描述 在这里插入图片描述

滑动窗口解法思路:

  • 1.先让窗口的右边界移动,如果子数组的和大于或等于了target,记录子数组长度,并同时移动窗口的左边界。
  • 2.在左右边界移动的过程中,只要子数组的和大于等于了target,那么就会得到一个子数组的长度,过程中需要一直维护这个变量为当前最小值
  • 3.窗口左侧边界的移动时,说明子数组之和已经大于或等于了target,为了测试减小一个左侧的数是否还成立,若成立就得到了更小的子数组长度。
// C++ 滑动窗口
class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        // 滑动窗口的起点
        int i = 0;
        // 子数组的和
        int sum = 0;
        // 维护的子数组的长度
        int res = nums.size() + 1;
        // j为子数组的终点
        for (int j = 0; j<nums.size(); j++){
            sum += nums[j];
            while(sum >= target){
                // j-i+1为子数组的长度
                res = res<(j-i+1) ? res : j-i+1;
                sum -= nums[i];
                // 核心:窗口左边界移动
                i += 1;
            }
        }
        return res>nums.size() ? 0 : res;
    }
};