【力扣算法刷题笔记】3.滑动窗口

定义

滑动窗口:简单的意思就是说,定义了两个指针(左指针及右指针),循环快指针,不断判断两个指针之间的是否符合条件,如果不符合条件左指针+1

下面是伪代码

const functionName = (s) => {
        // Step 1: 定义需要维护的变量们 (对于滑动窗口类题目,这些变量通常是最小长度,最大长度,或者哈希表)
        let x, y = ..., ...

        // Step 2: 定义窗口的首尾端 (start, end), 然后滑动窗口
        let start = 0
        for(let end = 0; end < s.length; end++){
            // Step 3: 更新需要维护的变量, 有的变量需要一个if语句来维护 (比如最大最小长度)
            let x = new_x
            if (condition) {
                y = new_y
			}
            /*
            ------------- 下面是两种情况,读者请根据题意二选1 -------------
           	*/
            // Step 4 - 情况1
            // 如果题目的窗口长度固定:用一个if语句判断一下当前窗口长度是否达到了限定长度 
            // 如果达到了,窗口左指针前移一个单位,从而保证下一次右指针右移时,窗口长度保持不变, 
            // 左指针移动之前, 先更新Step 1定义的(部分或所有)维护变量 
            if (窗口长度达到了限定长度) {
                 更新 (部分或所有) 维护变量 
                 窗口左指针前移一个单位保证下一次右指针右移时窗口长度保持不变
			}
            // Step 4 - 情况2
            // 如果题目的窗口长度可变: 这个时候一般涉及到窗口是否合法的问题
            // 如果当前窗口不合法时, 用一个while去不断移动窗口左指针, 从而剔除非法元素直到窗口再次合法
            // 在左指针移动之前更新Step 1定义的(部分或所有)维护变量 
            while (不合法){
                # 更新 (部分或所有) 维护变量 
                # 不断移动窗口左指针直到窗口再次合法
        	}
		}
        // Step 5: 返回答案
        return ...
}

代码

练习一:无重复字符的最长子串

练习地址:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

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

思路:使用哈希判断是否重复,使用滑动窗口一遍循环搞定

/**
 * @param {string} s
 * @return {number}
 */
var lengthOfLongestSubstring = function(s) {
  const sArr = s.split("");
  let start = 0, end = 0;
  let tempMap = {};
  let res = 0;
  for(; end < sArr.length; end++) {
    if (tempMap[sArr[end]]) {
      res = Math.max(end - start, res);
      start++;
      end = start;
      tempMap = {}
    }
    tempMap[sArr[end]] = 1;
  }
  return Math.max(end - start, res);
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AtalantaDavis

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值