长期更新的Leetcode每日一题
记录自己的学习过程。
209. 长度最小的子数组
题目描述
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组,并返回其长度。如果不存在符合条件的连续子数组,返回 0。
20200628
链接:https://leetcode-cn.com/problems/minimum-size-subarray-sum
解法一
暴力求解,时间复杂度n^2
class Solution {
public:
int minSubArrayLen(int s, vector<int>& nums) {
if (s < 0 || nums.size() == 0) return 0;
if (nums.size() == 1)
{if(nums[0]>=s) return 1;
else return 0;
}
bool slove = false;
int min = nums.size() + 1;
for (int i = 0; i < nums.size() - 1; i++)
{
int sum = nums[i];
int flag = i + 1;
int steps = 1;
while (sum < s && flag!=nums.size())
{
sum += nums[flag];
steps++;
flag++;
}
if (sum>=s && steps < min)
{
min = steps;
slove = true;
}
}
if(slove ==true) return min;
else return 0;
}
};
执行时间高达924ms
解法二
移动窗口法
class Solution {
public:
int minSubArrayLen(int s, vector<int>& nums) {
int mins = INT_MAX; //最小步数
int left = 0;//窗口最左侧
int right = 0;//窗口右侧
int inwindows = 0;//窗口内全部数据的和
for (int i = 0; i < nums.size(); i++)
{
right = i;
inwindows += nums[right];
while (inwindows >= s) { //窗口左侧不断前进,直到小于s,则退出循环
mins = min(mins, right - left + 1);
inwindows -= nums[left];
left++;
}
}
return left == 0 ? 0 : mins;
}
};