[209. Minimum Size Subarray Sum][(https://leetcode.cn/problems/minimum-size-subarray-sum/)
暴力解法
- 两个for循环,不断寻找符合条件的子序列
class Solution {public: int minSubArrayLen(int target, vector& nums) { int result = INT32_MAX; // 最终的结果 int total = 0; // 子序列的数值之和 int count = 0; // 子序列的长度 for (int i = 0; i < nums.size(); i++) { // 设置子序列起点为i total = 0; for (int j = i; j = target) { // 一旦发现子序列和超过了s,更新result count = j - i + 1; // 更新子序列的长度 result = result < subLength ? result : subLength; break; // 因为是找符合条件最短的子序列,所以一旦符合条件就break } } } // 返回0,说明没有符合条件的子序列 return result == INT32_MAX ? 0 : result; }};
时间复杂度:O(n^2)
空间复杂度:O(1)
滑动窗口
- 所谓滑动窗口:不断调节子序列起始位置和终止位置,从而得出想要的结果。
- 在暴力解法中,我们使用了两个for循环,若用滑动窗口如何以一个for循环得出结果呢?
- 思路:
- 首先,一个for循环是用来表示滑动窗口的起始位置,还是终止位置?若是表示起始位置,其实看着和暴力解法相差无几。因此for循环应该用来表示终止位置
- 三个重点:
- 滑动窗口内表示的是什么?
- 窗口其实就是一个满足条件的连续子数组
- 滑动窗口如何移动起始位置?
- 若窗口内总值sum大于target,则需要向前移动起始位置
- 滑动窗口如何移动终止位置?
- 若窗口内sum小于target,则需要向前移动终止位置
- 滑动窗口内表示的是什么?
class Solution {public: int minSubArrayLen(int target, vector& nums) { int left = 0;//滑动窗口起始位置 int total = 0;//滑动窗口终止位置 int count = 0;//滑动窗口长度 int result = INT32_MAX;//最终长度值 for( int right = 0; right = target) { result = count < result ? count : result; --count; total -= nums[left++]; } } return result == INT32_MAX ? 0 : result; }};
时间复杂度:O(n)
空间复杂度:O(1)