力扣209:长度最小的子数组
- 题目
- 思路
- 代码
题目
给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
思路
这道题我们先把条件改一下,我们先找符合条件的子数组不需要要长度最小的,那么我们只需要一个for循环再加一个if判断就可以了,思路就是我们从数组头开始一个一个的加直到总值大于target即可。现在我们再想怎么得到长度最小的子数组,要知道我们的条件是总和大于等于target的子数组所以在我们加上最后一个数满足条件时我们当时子数组的尾就已经定死了,我们只能移动头也就是我们可以减去子数组第一个位置来判断是否还满足条件。每次移动头之前我们都判断一下现在子数组的长度是否是最小的。所以整体的思路就是我们先移动子数组的尾等尾定死了我们就再移动头直到没法满足条件我们再开始移动尾,然后满足条件后再继续移动头。这样来回的移动头尾的位置从而得到长度最小的子数组。
所以我们发现我们的子数组是在不断的移动的也可以说是在滑动的,这也就是滑动窗口的思路。
代码
class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int res = INT_MAX;int n = nums.size();if(n == 0){return 0;}//子数组的范围int end = 0;int start = 0;int total = 0;while(end < n){//移动子数组的尾直到满足条件total += nums[end];//移动子数组的头直到不满足条件while(total >= target){//等到total大于target//我们就可以移动子数组的头从而得到最小长度res = min(res,end-start+1);total -= nums[start];start++;}end++;}return res == INT_MAX ? 0 : res;}
};