一:题目
二:上码
class Solution {
public:
/**
思路:
1.滑动窗口解法
1>:确定窗口内是什么
2>:确定窗口的起始位置
3>:确定窗口的终止位置
2.窗口:也就是我们的求的连续字符串的和
3.窗口的起始位置: 窗口的起始位置最先是我们数组的起始位置,当窗口内连续数组的和大于target的时候,
起始位置就需要往前移动来缩小我们窗口的大小
4.窗口的终止位置: 窗口的终止位置就是我们的数组的下标
*/
int minSubArrayLen(int target, vector<int>& nums) {
int i = 0;//起始位置
int length = 0;//窗口的大小
int ans = INT_MAX;
int sum = 0;
for (int j = 0; j < nums.size(); j++) {
sum += nums[j];
while (sum >= target) {//要开始移动我们窗口的起始位置
length = (j-i+1);//这里加一是因为 我们的j是从0开始的
ans = ans > length ?length :ans;
//开始缩小我们的窗口
sum -= nums[i++];
}
}
return ans == INT_MAX ? 0 : ans;
}
};
// class Solution {
// public:
// /**
// 思路:
// 1.暴力解法
// 两层for循环,记录下来 >=target 的字符串长度。
// 2.超时
// */
// int minSubArrayLen(int target, vector<int>& nums) {
// int length = nums.size();
// int ans = INT_MAX;
// for (int i = 0; i < length; i++) {
// vector<int> v;
// for (int j = i; j < nums.size(); j++) {
// v.push_back(nums[j]);
// int sum = accumulate(v.begin(),v.end(),0);
// if(sum >= target) {
// if (ans > v.size()) {
// ans = v.size();
// } else {
// break;
// }
// }
// }
// }
// if(ans == INT_MAX) return 0;
// return ans;
// }
// };