leetcode209. 长度最小的子数组
暴力解法——超时
#include <iostream>
using namespace std;
#include <vector>
class Solution {
public:
int minSubArrayLen( vector<int>& nums, int target) {
int minlen = nums.size();
int flag = 0;
for (int i = 0; i < nums.size(); i++)
{
int sum = 0;
int lenth = 0;
for (int j = i; j < nums.size(); j++)
{
sum += nums[j];
lenth++;
if (sum >= target)
break;
}
if (lenth <= minlen && sum >= target)
{
flag = 1;
minlen = lenth;
}
}
if (minlen == nums.size() && flag == 0)
return 0;
else return minlen;
}
};
int main(void)
{
vector <int> num={ 1,1,1,1,1,1,1,1 };
int target = 11;
Solution s;
cout << s.minSubArrayLen(num, target);
return 0;
}
暴力求解2
class Solution {
public:
int minSubArrayLen( int target, vector<int>& nums) {
int result = INT32_MAX;
int sum = 0;
int subLength = 0;
for (int i = 0; i < nums.size(); i++)
{
sum = 0;
for (int j = i; j < nums.size(); j++)
{
sum += nums[j];
if (sum >= target)
{
subLength = j - i + 1;
result = result < subLength ? result : subLength;
break;
}
}
}
return result == INT32_MAX ? 0 : result;
}
};
滑动窗口
class Solution {
public:
int minSubArrayLen(int s, vector<int>& nums) {
int n = nums.size();
if (n == 0) {
return 0;
}
int ans = INT_MAX;
int start = 0, end = 0;
int sum = 0;
while (end < n) {
sum += nums[end];
while (sum >= s) {
ans = min(ans, end - start + 1);
sum -= nums[start];
start++;
}
end++;
}
return ans == INT_MAX ? 0 : ans;
}
};