【LeetCode刷题】Day 7
题目1:209.长度最小的子数组
思路分析:
思路1:暴力枚举 O(N2)
思路2:滑动窗口 O(N)
-
滑动窗口整体思路:
-
- 初始化左右指针;
-
- 进窗口:循环条件、维护信息
-
- 判断:判断是否达到条件,从而决定是否出窗口。
-
- 更新结果:这一点是就题论题,需要判断在哪里更新结果位置。
本题的具体体现:
-
- 初始化左右指针:
int left = 0 , right = 0;
- 初始化左右指针:
-
- 进窗口:条件:
sum += nums[right];
维护的信息:子数组的和sum
;
- 进窗口:条件:
-
- 判断:当前子数组是否满足题干要求(
sum >= target
),满足记录长度;
- 判断:当前子数组是否满足题干要求(
-
- 更新结果:对于这道题而言,我们需要的是最小长度,因此一次条件成立并不能满足,需要比对后,更新结果。判断条件为成立条件,则需要在条件循环内部更新。
通俗的来讲思路的话:从left开始寻找满足题意的该位置长度最小的子数组,满足题意就到下一个位置,继续找该位置长度最小的子数组。
注意:感觉和暴力有些像,但这里我们的右端点是不需要更新到和left相同的,因为有上一个数的基础,知道上一个子数组是刚好多了右边一位才满足题意的,我们left到第二位置后,是要检查少去第一位,是否还满足,不满足就更新右端点。找到当前位置的长度最小的子数组。满足,就代表这就是当前位置最小长度的子数组,就left更新。
代码实现:
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
// 滑动窗口
int n