题目:https://leetcode-cn.com/problems/minimum-size-subarray-sum/
思路一:暴力解法
分析:
要找到连续子数组的和大于指定值,以每个数组元素为子数组的开始元素,找到其和大于等于指定值的数组就停止,并记录其长度。
步骤:
- 计算数组的长度;定义一个变量用于表示连续子数组的累加和;定义一个变量用于存储每个子连续数组的个数;定义一个变量,用于存储最少的子连续数组的个数,开始值设为最大
- 从头开始遍历数组元素,直到所有元素遍历结束
- 从访问的数组元素开始做累加,直到其和大于或等于目标值停止,记录此次子数组的长度;如果比原来的小,存储最少的子连续数组的个数的变量刷新,并且累加和设为0(注意:子连续数组的开头元素没刷新一次,累加和就要清0一次)
- 如果,存储最少的子连续数组的个数的变量没有刷新,依然是最大值,则就说明不存在这样的子连续数组,返回0;否则,就将最少子连续数组的个数
int minSubArrayLen(int s, vector<int>& nums) {
int len=nums.size();
int sum=0;
int size=0;
int result=INT_MAX;
for(int i=0;i<len;i++)
{
for(int j=i;j<len;j++)
{
sum+=nums[j];
if(sum>=s)
{
size=j-i+1;
break;
}
}
sum=0;//刷新的位置
if(result>size)
{
result=size;
}
}
if (result == INT_MAX)
{
result = 0;
}
return result;
}
- 思路二:滑动窗口法(动态的滑动窗口)
分析:
滑动窗口就是不断地调整子序列的起始位置和终止位置,从而得到我们所要的结果。
实现滑动窗口,主要确定如下三点:
-
窗口内是什么
-
如何移动窗口的起始位置
-
如何移动窗口的结束位置?
在本题中,窗口就是满足其和>=s的长度最小的连续子数组,
窗口的起始位置 如何移动?当当前窗口的值大于时,窗口就前移, 如何移动窗口的结束位置?窗口结束的位置就是遍历数组的指针,当其和小于s时,就向后移动窗口的结束位置
步骤:
-
计算数组的长度;定义一个变量用于表示连续子数组的累加和;定义一个变量用于存当前窗口的长度;定义一个变量,用于
存储最少的子连续数组的个数,开始值设为最大;定义一个 变 量,用于记录敞口的起始位置 -
窗口的结束位置遍历数组元素,
-
窗口的数值做累加,当窗口的大于等于时,计算当前窗口的长度,和之前窗口的长度作比较,记下最小的,然后滑动窗口的起始位 置前移
-
判断滑动窗口有没有被赋值,没有就返回0,否则就返回窗口的长度
int minSubArrayLen(int s, vector<int>& nums) {
int len = nums.size();
int sum = 0;
int size = 0;
int result = INT_MAX;
int i = 0;
for (int j = 0; j < len; j++)
{
sum += nums[j];
while (sum >= s)
{
size = j - i + 1;
result = result < size ? result : size;
sum -= nums[i++];
}
}
result = result == INT_MAX ? 0 : result;
return result;
}