leetcode 209. 长度最小的子数组
大家好,我是小学五年级在读的蒟蒻,专注于后端,一起见证蒟蒻的成长,您的评论与赞与关注是我的最大动力,如有错误还请不吝赐教,万分感谢。一起支持原创吧!纯手打有笔误还望谅解。
题目描述
给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
题解一
使用for循环暴力求解
从数组第一个元素开始遍历数组,将每个元素的值相加,若遇到元素大于或等于给定值时则将相加的数组长度与原来已有的长度相比较按长度小的更新值,遍历完毕则判断是否与初始值一样,若不同则返回更新后的值,否则返回0
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int result=__INT32_MAX__;
int arrLength=0;
int sum;
for(int i=0;i<nums.size();i++){
sum=0;
for(int j=i;j<nums.size();j++){
sum+=nums[j];
if(sum>=target){
arrLength=j-i+1;
result=arrLength>result?result:arrLength;
break;
}
}
}
return result==__INT32_MAX__?0:result;
}
};
题解二
使用滑动窗口
将数据从首元素就开始相加,如果数据大于或小于给定值,则开始从头递减元素,然后不断更新符合条件的数组长度,最后判断是否长度与初始值一样,不一样返回更新后的值,否则返回0
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int result=__INT32_MAX__;
int arrLength=0;
int sum=0;
int j=0;
for(int i=0;i<nums.size();i++){
sum+=nums[i];
while (sum>=target)
{
arrLength=i-j+1;
result=arrLength<result?arrLength:result;
sum-=nums[j++];
/* code */
}
}
return result==__INT32_MAX__?0:result;
}
};