209长度最小子数组 -- 滑动窗口(双指针)

长度最小子数组 – 滑动窗口(双指针)

本题使用滑动窗口法。加深对滑动窗口、双指针法的理解。

1. 暴力法 – O( n 2 n^2 n2)

第一个for循环 i 遍历所有数组元素

第二个for循环遍历 j 遍历 i 之后的所有元素,判断 i 开始的符合要求的最短区间长度

2. 滑动窗口法(双指针)-- O(n)

重点:确定 for 循环 j 代表滑动窗口的结束位置

难点:确定滑动窗口开始位置及其更新策略

209长度最小子数组 -- 滑动窗口(双指针)_第1张图片
int minSubArrayLen(int target, vector<int>& nums) {
    int minLength = INT32_MAX;  // 记录最短区间长度
    int left = 0;  // 记录区间左边界
    int sum = 0;  // 记录当前区间元素总和
    bool tag = true;  // 记录当前数组是否优符合要求的区间
    for(int right = 0; right < nums.size(); ++right){  // 更新右边界
        sum += nums[right];  // 更新区间元素和
        while(sum >= target){  // 如果当前区间元素和符合要求
            tag = false;
            if(right - left + 1 < minLength){  // 如果当前区间长度为最小,则更新最小区间长度
                minLength = right - left + 1;
            }
            sum -= nums[left++];  // 更新区间左边界
        }
    }
    if(tag) return 0;
    else return minLength;
}

你可能感兴趣的:(算法,算法,数据结构,c++)