209.长度最小的子数组
题目建议: 本题关键在于理解滑动窗口,这个滑动窗口看文字讲解 还挺难理解的,建议大家先看视频讲解。 拓展题目可以先不做。
题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
文章讲解:代码随想录
视频讲解:拿下滑动窗口! | LeetCode 209 长度最小的子数组_哔哩哔哩_bilibili
按照C老师的思路改进:
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int left=0;
int right=0;
int sum=0;
int length=INT_MAX;//这里的INT_MAX还是啥的,暂时不会写,应该是宏变量吧;
while(right<=nums.size()-1){
sum+=nums[right];
while(sum>=target){
length=min(length,right-left+1);//这里自己没想到使用min
sum-=nums[left];
left++;
}
right++;
//length=right-left+1;
}
return length!=INT_MAX?length:0 ;//最后应该比较length是否仍然等于INX_MAX
}
};
自己的思路:
2023/08/10 16:31 再次做的时候还是没思路,即便告诉使用滑动窗口;
没有思路,直接请教的C老师:
C老师给的其中一个滑动窗口的核心思路:
1、初始化两个指针 left 和 right,都指向数组的开始;
2、移动 right 指针,增加窗口的大小,直到窗口中的元素和大于等于 target;
3、记录此时窗口的大小;
4、移动 left 指针,尝试减少窗口的大小,同时更新最小窗口大小;
5、重复步骤2-4,直到 right 达到数组的末尾;
##参考C老师的思路写的代码,报错:
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int left=0;
int right=0;
int sum=0;
int length=INT_MAX;//这里的INT_MAX还是啥的,暂时不会写,应该是宏变量吧;
while(right<=nums.size()-1){
sum+=nums[right];
while(sum>=target){
left++;
sum-=nums[left];
length=right-left+1;
}
right++;
length=right-left+1;
}
return length;
}
};
自己代码存在的问题: