目录
现在一个数组nums中找到最小长度的连续子数组,使子数组元素之和大于或等于给定值date
介绍滑动窗口
在一个数组或字符串中找到满足条件的子数组或子串,通过移动起始位置和终止位置,从而构造成一个滑动的窗口,使得单次遍历便可解决问题,时间复杂度较低
实践:
class solution
{
public:
int find(vector<int> nums,int date)
{
int result=999;
int lenght;
int i=0;//起始位置
int sum=0;
for(int j=0;j<nums.size();j++)
{
sum+=nums[j];
while(sum>=date)
{
lenght=j-i+1;
result=min(result,lenght);
sum-=nums[i];
i++;
}
}
return result;
}
int min(int& a,int& b)
{
if(a<b)
return a;
return b;
}
};
当窗口内元素和大于
date
时,此时说明窗口已经符合条件,将其长度储存,这时候终止位置已经没有移动的必要了,(因为终止位置向右移动只会让元素和变大),此时我们让起始位置向后移动,试图在更小范围内寻找有无符合条件的长度。注意:起始位置向后移动是一个连续的过程应该用
while
而不是if
,因为起始位置在移动一位后,其后一位至末尾元素和仍可能符合条件,这时候应该让起始位置继续向后移动,而如果使用if
,在起始位置向后移动一位后,便会进入下一个for
循环,即终止位置向后移动一位,这样会忽略掉一些本来符和情况的情况。
谢谢。