1 .滑动窗口思想:
这是在大数组中运行的子列表,它是基本元素的集合。 如果您有一个数组[a b c d e f g h ],并且大小为3的滑动窗口在上面滑动,则:
[a b c]
[b c d]
[c d e]
[d e f]
[e f g]
[f g h]
通常,使用该窗口在数组的合法区间内滑动,可以大大提高算法的效率
2 .滑动窗口的一些例题应用
1。
思考:
滑动窗口算法可以解决字符串子字符串中的一些类型的应用问题
主要思想是:left在right的同时从0变化。 如果散列表中记录的dict多次出现,则将左边距重新代入新出现的位置,右边距无论如何向后移动一个,每次记录max。 max从右向左引再添加一个是因为从0开始。
图解:
源代码:
#包含
#包含
intlengthoflongestsubstring (char * s ) {
if(s==null )返回0;
int max=0; //记录最长长度max
int left=0,right=0; //幻灯片窗口的左边界和右边界
int dict[256]={0}; //和前面的排序一样,制作像散列表那样的东西,用排列记录其出现次数
索引;
for (; s[right]!=' '; right ()。
索引=s [ right ]; //得到对应文字的下标
if(dict[index]left ) )。
left=dict[index];
dict[index]=right 1; //注意:到只有一个字符的时候为止的长度是1,所以这里右边距加1
if (最大左1 ) ) )。
max=right-left 1; //更新最大值
}
返回最大值;
}
主()。
char a[99];
gets(a;
int n;
n=长整型(a;
printf('%d ',n );
}
思考:
同样地,通过滑动窗口,对每个循环求和,同时移动右边距,如果和大于目标值则进行求最小值的判断,第一次进入时将最小值从此时的右边距中减去0,并且sum减去左边距的值后进行左边距的判断此时,如果左边界不大于目标值,则继续原始循环
intminsubarraylen(ints,int* nums,int numsSize )。
int left=0;
int right=0;
int min=0;
int sum=0;
wile (轻型编号) {
sum =nums[right];
光之美少女;
wile(sum=s ) {
if(min==0) {
最小=右左;
}
else{
最小光左(if ) )。
最小=右左;
}
sum -=nums[left];
左足;
}
}
返回分钟;
}