当前位置:   article > 正文

滑动窗口算法归纳_滑动算法

滑动算法

1:滑动窗口的概念

      滑动窗口是一种基于双指针的一种思想,两个指针指向的元素之间形成一个窗口顾名思义,就像一个滑动的窗口,套在一个序列中,左右的滑动,窗口内就是一个内容集。

2:分类

      窗口有两类,一种是固定大小类的窗口(固定窗口),一类是大小动态变化的窗口(动态窗口)。

3、滑动窗口算法思路

滑动窗口的应用场景有几个特点:

1. 需要输出或比较的结果在原数据结构中是连续排列的;

2. 每次窗口滑动时,只需观察窗口两端元素的变化,无论窗口多长,每次只操作两个头尾元素,当用到的窗口比较长时,可以显著减少操作次数;

3. 窗口内元素的整体性比较强,窗口滑动可以只通过操作头尾两个位置的变化实现,但对比结果时往往要用到窗口中所有元素

4该问题本身可以通过暴力或dp求解的;

滑动算法核心模版总结

1:设置i遍历序列(从头到尾)

2:设置j为新序列开始的头部标记;

3:设置index,记录目标值(长度,和等),根据条件更新

  1. void hd(....)
  2. {
  3. for(int i=0;i<n;i++)
  4. {
  5. for(循环条件)/while(循环条件)
  6. 寻找某一段序列,直到找到符合中断条件的点
  7. j=//更新头部,开始新的序列
  8. index=;//根据题中条件同步更新目标值
  9. }
  10. index=;//最后更新,防止上一次更新后一直到尾部都没有中断的情况而出现的遗漏
  11. }

例题:

例题1——固定大小类(一般是求和/积类):

蓝桥杯算法提高VIP-和最大子序列 - C语言网

  1. #include<stdio.h>
  2. int main()
  3. {
  4. int n,max;
  5. int a[100005]={0};
  6. int sum[10005]={0};
  7. scanf("%d",&n);
  8. for(int i=1;i<=n;i++)
  9. {
  10. scanf("%d",&a[i]);
  11. }
  12. max=sum[1]=a[1];
  13. for(int i=2;i<=n;i++)
  14. {
  15. int temp=sum[i-1]+a[i];
  16. if(temp<sum[i-1])
  17. {
  18. sum[i]=0;
  19. }
  20. else
  21. {
  22. sum[i]=temp;
  23. }
  24. if(max<sum[i])
  25. {
  26. max=sum[i];
  27. }
  28. }
  29. printf("%d\n",max);
  30. return 0;
  31. }

例题2——动态型(一般是求长度):

力扣icon-default.png?t=M5H6https://leetcode-cn.com/problems/minimum-size-subarray-sum/

  1. #include<stdio.h>
  2. int main()
  3. {
  4. int n,s,sum=0,end=0;
  5. int minlen;
  6. scanf("%d%d",&n,&s);
  7. int a[n]={0};
  8. minlen=n;
  9. for(int i=0;i<n;i++)//录入数组
  10. {
  11. scanf("%d",&a[i]);
  12. }
  13. for(int i=0;i<n;i++) //从头开始找
  14. {
  15. while(sum<s)//找到一个符合条件的序列
  16. {
  17. sum+=a[end];
  18. end++;
  19. }
  20. if(sum>=s)
  21. {
  22. if(minlen>(end-i))
  23. {
  24. minlen=end-i;
  25. }
  26. }
  27. sum-=a[i];//头部向右移动 ,开始下一轮
  28. }
  29. printf("%d\n",minlen);
  30. return 0;
  31. }

例题3——动态类型:

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:

输入: "abcabcbb"

输出: 3

解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

  1. #include<stdio.h>
  2. #include<string.h>
  3. int hd(char a[])
  4. {
  5. int i = 0, j = 0;
  6. int maxlen = 0;//最大长度
  7. int curlen = 0;//当前长度
  8. int len = strlen(a);//获取字符串长度
  9. if (len == 0)
  10. return 0;
  11. for (; j < len && len - i > maxlen; j++) {
  12. curlen++;
  13. for (int k = i; k <= j; k++)
  14. {
  15. if (a[k] == a[j + 1]) //对比已有的字符串中,是否有与即将出现的下一个字符相同的字符
  16. {
  17. if (curlen > maxlen)//如果有,则更新当前长度
  18. maxlen = curlen;
  19. i = k + 1;//从出现重复地方开始舍弃前面的字符串,开始新的序列
  20. curlen = j - i + 1;//跟新当前的长度
  21. break;
  22. }
  23. }
  24. }
  25. return maxlen>curlen?maxlen:curlen; //跟新最大长度
  26. }
  27. int main()
  28. {
  29. char a[10000]={0};
  30. scanf("%s",a);
  31. printf("%d\n",hd(a));
  32. }

//整合其他大佬的资料结合自己的理解编写,有错误之处欢迎指正。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/276934
推荐阅读
相关标签
  

闽ICP备14008679号