Leecode.209
给定一个含有 n
个正整数的数组和一个正整数 target
。
找出该数组中满足其总和大于等于 target
的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr]
,并返回其长度。如果不存在符合条件的子数组,返回 0
。
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int sum = 0;
int i = 0;
int result = INT32_MAX;
int sublength = 0;
for(int j=0;j<nums.size();j++)
{
sum += nums[j];
while(sum>=target)
{
sublength = j-i+1;
if (sublength < result)
{
result =sublength;
}
sum = sum - nums[i];
i++;
}
}
return result>nums.size()?0:result;
}
};
滑动窗口法:
注意事项:
for循环里的j指向的是终止位置,
最重要的思路是如何移动起始位置,
当集合里的元素满足条件是,移动起始位置即可,
错误:
1.在写for循环时,写了以下
for(int j=0;j<=nums.size();j++)
j根本取不到num.size(),应该是<号,低级错误。
2.在写以下两行时,写反了,导致i先移动,sum再减去值,导致结果错误,应该先减值再移动。
sum = sum - nums[i];
i++;
3.在写以下时,result如果没有被输入,就一直是一个大的值,其实应该返回0,所以判断了以下result,如果大于数组长度,说明没有被输入,应该返回0,没有满足的长度。
return result>nums.size()?0:result;
应该改成以下这句,INT32_MAX是大于nums.size()的数,他本身的值没变的时候,才代表没有被输入。
return result==INT32_MAX?0:result;
暴力解法:
class Solution {
public:
int minSubArrayLen(int s, vector<int>& nums) {
int result = INT32_MAX; // 最终的结果
int sum = 0; // 子序列的数值之和
int subLength = 0; // 子序列的长度
for (int i = 0; i < nums.size(); i++) { // 设置子序列起点为i
sum = 0;
for (int j = i; j < nums.size(); j++) { // 设置子序列终止位置为j
sum += nums[j];
if (sum >= s) { // 一旦发现子序列和超过了s,更新result
subLength = j - i + 1; // 取子序列的长度
result = result < subLength ? result : subLength;
break; // 因为我们是找符合条件最短的子序列,所以一旦符合条件就break
}
}
}
// 如果result没有被赋值的话,就返回0,说明没有符合条件的子序列
return result == INT32_MAX ? 0 : result;
}
};