Fork me on GitHub

算法题笔记-滑动窗口

refer doc
leetcode对应题目:

解题模板:

//外层循环扩展右边界,内层循环扩展左边界
for (int l = 0, r = 0 ; r < n ; r++) {
	//当前考虑的元素
	while (l <= r && check()) {
        //扩展左边界
		//触发条件,改变滑动窗口左侧边界
    }
    //区间[left,right]符合题意,统计相关信息
	// 统计单个窗口信息,并进行相关操作
}

模板理解与扩展

  • 左右指针 l r
  • for遍历循环内嵌套while循环
  • 满足while判断条件则变更左边界
  • 每次循环统计滑动窗口

无重复最长子串模板扩展示例

    public int lengthOfLongestSubstring(String s) {
        //滑动窗口
        char[] ss = s.toCharArray();
        Set<Character> set = new HashSet<>();//去重
        int res = 0;//结果
        for(int left = 0, right = 0; right < s.length(); right++) {//每一轮右端点都扩一个。
            char ch = ss[right];//right指向的元素,也是当前要考虑的元素
            while(set.contains(ch)) {//set中有ch,则缩短左边界,同时从set集合出元素.去掉模板的l<=r,不符合题意
                set.remove(ss[left]);
                left++;
            }
            set.add(ss[right]);//别忘。将当前元素加入。
            res = Math.max(res, right - left + 1);//计算当前不重复子串的长度。
        }
        return res;
    }
posted @ 2024-09-09 09:38  园狐  阅读(4)  评论(0编辑  收藏  举报