# 题目

给定一个含有 n 个正整数的数组和一个正整数 target

找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度 **。** 如果不存在符合条件的子数组,返回 0

209. 长度最小的子数组 - 力扣(LeetCode)

# 分析

先惯例暴力解法,两个 for 循环,第一个 for 遍历数组,第二个 for 找满足条件的数组。

// 时间复杂度:O (n^2)
// 空间复杂度:O (1)
class Solution {
public:
    int minSubArrayLen(int s, vector<int>& nums) {
        int result = INT32_MAX; // 最终的结果
        int sum = 0; // 子序列的数值之和
        int subLength = 0; // 子序列的长度
        for (int i = 0; i < nums.size(); i++) { // 设置子序列起点为 i
            sum = 0;
            for (int j = i; j < nums.size(); j++) { // 设置子序列终止位置为 j
                sum += nums[j];
                if (sum >= s) { // 一旦发现子序列和超过了 s,更新 result
                    subLength = j - i + 1; // 取子序列的长度
                    result = result < subLength ? result : subLength;
                    break; // 因为我们是找符合条件最短的子序列,所以一旦符合条件就 break
                }
            }
        }
        // 如果 result 没有被赋值的话,就返回 0,说明没有符合条件的子序列
        return result == INT32_MAX ? 0 : result;
    }
};

滑动窗口

滑动窗口是一种数据处理技术,用于处理数据序列或数据流。它的基本原理是在数据序列上定义一个固定大小的窗口,然后通过滑动窗口的方式在序列上移动,以便对窗口内的数据进行处理和分析。

滑动窗口通常有两个参数:窗口大小和滑动步长。

  1. 窗口大小:窗口大小指定了在数据序列中包含的元素数量。例如,如果窗口大小为 5,则每个窗口将包含 5 个连续的元素。
  2. 滑动步长:滑动步长指定了窗口在数据序列中滑动的距离。例如,如果滑动步长为 1,则每次窗口将向右滑动一个元素。

上面暴力解法两个 for,一个确定数组的起点,另一个确定目标数组的终点。

如果用一个 for 的话,可以选择来做终点。

// 时间复杂度:O (n)
// 空间复杂度:O (1)
class Solution {
public:
    int minSubArrayLen(int s, vector<int>& nums) {
        int result = INT32_MAX;
        int sum = 0; // 滑动窗口数值之和
        int i = 0; // 滑动窗口起始位置
        int subLength = 0; // 滑动窗口的长度
        for (int j = 0; j < nums.size(); j++) {
            sum += nums[j];
            // 注意这里使用 while,每次更新 i(起始位置),并不断比较子序列是否符合条件
            while (sum >= s) {
                subLength = (j - i + 1); // 取子序列的长度
                result = result < subLength ? result : subLength;
                sum -= nums[i++]; // 这里体现出滑动窗口的精髓之处,不断变更 i(子序列的起始位置)
            }
        }
        // 如果 result 没有被赋值的话,就返回 0,说明没有符合条件的子序列
        return result == INT32_MAX ? 0 : result;
    }
};

# 使用

滑动窗口是一种常用的数据处理技术,适用于以下情况:

  1. 时序数据处理:滑动窗口常用于处理时序数据,例如时间序列分析、股票价格预测等。通过滑动窗口,可以在不断更新的数据流中获取固定大小的窗口,进行数据分析和预测。
  2. 数据流处理:当数据以流的形式不断产生时,滑动窗口可以用来对数据流进行实时处理。通过滑动窗口,可以对数据流进行分段处理,提取特征、计算统计量等。
  3. 网络通信:在网络通信中,滑动窗口协议常用于可靠传输和流量控制。发送方将数据分割成固定大小的窗口,接收方确认接收到的窗口并请求下一个窗口,以保证数据的可靠传输和流量控制。
  4. 数据处理和分析:滑动窗口可以用于对大规模数据集进行处理和分析。通过滑动窗口,可以将数据集分成多个窗口,对每个窗口进行分析,以提取特征、计算统计量等。

需要注意的是,滑动窗口的使用条件取决于具体的应用场景和需求。在使用滑动窗口时,需要根据实际情况确定窗口的大小、滑动的步长等参数,以满足数据处理和分析的要求。

更新于