滑动窗口:其实可以看作双指针法的一个变形,巧妙地将双层 for 循环将为单层,从而降低时间复杂度。
分析:由于本题是确定连续子序列,因此可以使用两个指针来控制连续子序列的长度
- 总和小于目标值则右边窗口右移
- 总和大于目标值则左边窗口左移
- 每个元素一进一出,所以时间复杂度为O(2*n)
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;
}
};