窗口移动算法

滑动窗口算法是一种重要的思想,常用于解决数组和字符串的子元素问题,将嵌套循环转化为单层循环,提高效率。算法包括定义左右边界、右边界扩张、左边界扩张等步骤,并适用于具有单调性的题目。文中通过无重复字符最长子串和求最大子数组和的案例进行阐述。
摘要由CSDN通过智能技术生成

窗口滑动算法

简介

滑动窗口算法思想是非常重要的一种思想,可以用来解决数组,字符串的子元素问题。它可以将嵌套循环的问题,转换为单层循环问题,降低时间复杂度,提高效率。

滑动窗口的思想非常简单,它将子数组(子字符串)理解成一个滑动的窗口,然后将这个窗口在数组上滑动,在窗口滑动的过程中,左边会出一个元素,右边会进一个元素,然后只需要计算当前窗口内的元素值即可。

可用滑动窗口思想解决的问题,一般有如下特点:

  1. 窗口内元素是连续的。就是说,抽象出来的这个可滑动的窗口,在原数组或字符串上是连续的。

  2. 窗口只能由左向右滑动,不能逆过来滑动。就是说,窗口的左右边界,只能从左到右增加,不能减少,即使局部也不可以。

算法思想

1.定义两个变量:right和right,用来表示两个边界。[left,right]表示窗口
2.首先right边界先扩张,到达指定的位置(根据题目来定),然后left开始扩张,直到指定的位置(依据题目来定)
3.重复上述步骤,直到right走到数组或者字符串的尾部为止

算法实现

left,right := 0,0 // 左右指针

// 窗口右边界滑动
for right < length {
   
  window.add(s[right])      // 右元素进窗
  right++                   // 右指针增加

  // 窗口满足条件
  for valid(window) && left<right {
   
    ...                      // 满足条件后的操作
    window.remove(arr[left]) // 左元素出窗
    left++                   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值