209. 长度最小的子数组
解题思路1
本题采用双for循环,遍历所有情况
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int sum = 0;
int result = INT32_MAX;//result为最后的结果,先给result赋一个最大的数
int mid = 0;//初始化子序列的长度
for(int i = 0; i<nums.size(); i++)
{
sum = 0;
for(int j=i;j<nums.size(); j++)
{
sum += nums[j];//从第i个数开始,逐次加上i后的数
if(sum >= target)//当所加数的和大于目标值时
{
mid = j - i + 1;//得出当前子序列长度
if(mid < result)
{
result = mid;
}
break;//得到result的值,退出内部循环
}
}
}
return result == INT32_MAX ? 0:result;//若result没有被赋值,即所加数的和从未大于等于目标值,返回0
}
};
解题思路2
采用滑动窗口法。
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int sum = 0;
int result = INT32_MAX;
int i = 0;//i为滑动窗口起始位置
int mid = 0;
for (int j=0; j<nums.size(); j++)
{
sum += nums[j];
while(sum >= target)
{
mid = (j - i + 1);//当前子序列的长度
result = result > mid ? mid : result;
sum = sum - nums[i];//减去窗口起始位置的值
i++;//窗口起始位置向后移一位
}
}
return result == INT32_MAX ? 0 :result;
}
};