滑动窗口算法

滑动窗口也是比较热门的算法之一,并且滑动算法是双指针的变种,在很多场景下均有应用

题目链接

209. 长度最小的子数组

参考题解
  1. class Solution {
  2. public int minSubArrayLen(int target, int[] nums) {
  3. int len = nums.length;
  4. int j = 0;
  5. int sum = 0;
  6. int res = len+1;
  7. for (int i = 0; i < len; i++) {
  8. sum += nums[i];
  9. while (sum >= target) {
  10. res = Math.min(res, i - j + 1);
  11. sum -= nums[j];
  12. j++;
  13. }
  14. }
  15. if (res == len+1){
  16. return 0;
  17. }
  18. return res;
  19. }
  20. }
滑动窗口思想

滑动窗口本质就是快慢指针,一个在前,一个在后,共同维护一个可变的区间,如下图红框所示就是一个窗口

随着指针的移动,快慢指针的区间会发生变动,但是总体上保持整体向前移动的趋势

因此滑动窗口可以解决最大子串和最小子串等相关问题

以上题为例,初始化两个指针,一个快指针一个慢指针,都指向数组的第一个元素

随着快指针移动,快慢指针之间就有一个区间,计算此区间的和,是否大于等于目标值target

如果不大于的话,则一直移动快指针,即一直扩大区间的长度

当区间内和大于等于target时,记录区间长度后则可以尝试缩小区间长度,判断缩小后的区间和是否满足条件

如果缩小区间后不满足条件,则继续移动快指针以扩大区间大小

否则,则移动慢指针缩小区间大小,每次满足条件后都需要计算区间的长度,并与上次满足条件的区间长度比较,得到最小的区间长度

如此往复,最终得到最小区间长度

参考资料

算法吧

代码随想录

熟能生巧,这种题型多练练,理解其中思想,必要时用笔在纸上画画图,更有益于理解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

举报

选择你想要举报的内容(必选)
  • 内容涉黄
  • 政治相关
  • 内容抄袭
  • 涉嫌广告
  • 内容侵权
  • 侮辱谩骂
  • 样式问题
  • 其他
点击体验
DeepSeekR1满血版
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回顶部

登录后您可以享受以下权益:

×