滑动窗口
滑动窗口
用变量标记窗口的右区间,右区间每次向右挪动一位,验证左区间能否缩小,如果可以就缩小,然后记录此时的长度,维护一个最小长度变量就可以了。
具体见题目
Leetcode.209
给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl,..., numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。滑动窗口 解决这个问题。
相比一下就能想出来的暴力解法,滑动窗口法精髓实质上是利用了以前的计算所计算出来的和,在基础上直接加减,从而降低复杂度。
#include <bits/stdc++.h> using namespace std; class Solution { public: int minSubArrayLen(int target, vector<int>& nums) { int first = 0,last =0,total = 0; int min = 999999999; for (; last<nums.size(); last++) { total+=nums[last]; while (total-nums[first]>=target) { total-=nums[first]; first++; } if (total >= target) { min = min<=(last-first+1)?min:(last-first+1); } } return min==999999999?0:min; } };
License:
CC BY 4.0