Leetcode_209长度最小的子数组——滑动窗口
Leetcode_209长度最小的子数组
给定一个含有 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
题解
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int left = 0;
int right = 1;
if(nums[0]>=target){
return 1;
}
int sum = nums[left];
int min_con = nums.size()+1;
for(;right<nums.size();right++){
sum += nums[right];
while(sum>=target && left<=right){
if(right-left+1<min_con){
min_con = right-left+1;
cout << "min: " << min_con << " left: " << nums[left] << endl;
}
if(sum-nums[left]>=target){
sum = sum-nums[left];
left++;
if(right-left+1<min_con){
min_con = right-left+1;
cout << "min: " << min_con << "left: " << nums[left] << endl;
}
}else{
break;
}
}
}
if(min_con==nums.size()+1){
return 0;
}
return min_con;
}
};
这题的核心思想是滑动窗口,窗口右端把所有可能都遍历一遍(for循环),左端则需要不断地缩小以找到最优解(while循环)。
我自己的代码是适合我自己理解的。官方题解虽然简洁,我是真理解不了细节。
最讨厌这种需要处理很多细节的问题,我是大老粗,整不来这些。
评论区已延迟加载滑到评论区附近时会自动加载,也可以现在手动打开。



