从零开始学习c++,每天起码做一道leetcode题目,在此记录,希望最后能够有所收获!
一、题目描述
给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
示例 1:
输入: target = 7, nums = [2,3,1,2,4,3]
输出: 2
解释: 子数组 [4,3] 是该条件下的长度最小的子数组。
示例 2:
输入: target = 4, nums = [1,4,4]
输出: 1
示例 3:
输入: target = 11, nums = [1,1,1,1,1,1,1,1]
输出: 0
二、思路分析
这道题是用滑动窗口的方法来解决的。
滑动窗口算法是一种常见的双指针算法,用于在序列或数组中寻找一个子序列,满足一定的条件。该算法的基本思想是维护一个窗口,通过移动窗口来寻找满足条件的子序列。下面是滑动窗口算法的详细描述:
- 确定窗口大小:首先需要确定窗口的大小,也就是包含多少个元素。这通常取决于问题的具体要求。
- 初始化窗口:从序列的开头开始,初始化窗口。通常情况下,窗口的初始位置是序列的前若干个元素。
- 移动窗口:接下来,移动窗口。具体的移动方式取决于问题的具体要求。通常情况下,窗口的右端点向右移动一个元素,即增加窗口的长度;或者窗口的左端点向右移动一个元素,即减少窗口的长度。
- 更新答案:在移动窗口的过程中,需要根据题目要求更新答案。通常情况下,更新答案需要用到窗口内的元素,可以通过两个指针来维护窗口内的元素。
- 终止条件:如果窗口已经移动到序列的结尾,算法就可以终止。
三、AC代码
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int ans=10000000;
int l=0,r=0;
int sum=0;
for(r=0;r<nums.size();r++){
sum+=nums[r];
while(sum>=target){
ans=min(ans,r-l+1);
sum-=nums[l];
l++;
}
}
return (ans==10000000)?0:ans;
}
};
四、总结
题目还算比较简单,主要之前接触过类似的题目,做起来还是比较容易的