# 题目
给定一个含有 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; | |
} | |
}; |
滑动窗口
滑动窗口是一种数据处理技术,用于处理数据序列或数据流。它的基本原理是在数据序列上定义一个固定大小的窗口,然后通过滑动窗口的方式在序列上移动,以便对窗口内的数据进行处理和分析。
滑动窗口通常有两个参数:窗口大小和滑动步长。
- 窗口大小:窗口大小指定了在数据序列中包含的元素数量。例如,如果窗口大小为 5,则每个窗口将包含 5 个连续的元素。
- 滑动步长:滑动步长指定了窗口在数据序列中滑动的距离。例如,如果滑动步长为 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; | |
} | |
}; |
# 使用
滑动窗口是一种常用的数据处理技术,适用于以下情况:
- 时序数据处理:滑动窗口常用于处理时序数据,例如时间序列分析、股票价格预测等。通过滑动窗口,可以在不断更新的数据流中获取固定大小的窗口,进行数据分析和预测。
- 数据流处理:当数据以流的形式不断产生时,滑动窗口可以用来对数据流进行实时处理。通过滑动窗口,可以对数据流进行分段处理,提取特征、计算统计量等。
- 网络通信:在网络通信中,滑动窗口协议常用于可靠传输和流量控制。发送方将数据分割成固定大小的窗口,接收方确认接收到的窗口并请求下一个窗口,以保证数据的可靠传输和流量控制。
- 数据处理和分析:滑动窗口可以用于对大规模数据集进行处理和分析。通过滑动窗口,可以将数据集分成多个窗口,对每个窗口进行分析,以提取特征、计算统计量等。
需要注意的是,滑动窗口的使用条件取决于具体的应用场景和需求。在使用滑动窗口时,需要根据实际情况确定窗口的大小、滑动的步长等参数,以满足数据处理和分析的要求。