leetcode209
题目:给定一个含有n个正整数的数组和一个正整数target。找出该数组中满足其和≥target的长度最小的连续子数组[numsl, numsl+1, …, numsr-1, numsr],并返回其长度。如果不存在符合条件的子数组,返回0
我的做法:
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int n = nums.size() + 1;
for (int i = 0; i < nums.size(); i++){
int temp = 0;
int m = 0;
for (int j = i; j < nums.size(); j++){
temp += nums[j];
m++;
if (temp >= target){
if (m < n){
n = m;
break;
}
}
}
}
if (n != nums.size() +1 ){
return n;
}
else{
return 0;
}
}
};
改进思路:
由于是连续数组,可将其考虑成一个不断往前进的伸缩弹簧,利用for循环来控制终点的往前进,每当和大于目标值时,起点以1的步幅向前进,从而找到最短数组
滑动数组:
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int n = nums.size() + 1;
int s = 0;
int temp = 0;
for (int i = 0; i < nums.size(); i++){
temp += nums[i];
while (temp >= target){
n = (i - s + 1) > n ? n : (i - s + 1);
temp -= nums[s++];
}
}
return n == nums.size() + 1 ? 0 : n;
}
};