滑动窗口算法:双指针高效解题秘籍

一、上期回顾

掌握单调栈 核心逻辑,快速查找左右侧最值元素,搞定每日温度、下一个更大元素等经典题。今天学习滑动窗口,双指针经典算法,解决子数组、子串、区间求和类高频考题。

二、滑动窗口核心概念

滑动窗口 = 左右双指针划定一个连续区间

  • 左指针 left:窗口左边界
  • 右指针 right:窗口右边界
  • 窗口不断向右滑动,动态收缩左边界,满足题意
  • 时间复杂度:O(n),远优于暴力双重循环 O (n²)

两大分类

  1. 固定长度窗口:窗口大小固定,依次滑动统计
  2. 可变长度窗口:窗口大小不固定,求最长 / 最短合法区间

三、固定长度滑动窗口(模板)

适用:定长子数组求和、平均值、最大最小值

复制代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

// 求长度为k的子数组最大和
int maxSumFixedWindow(vector<int>& nums, int k)
{
    int sum = 0;
    // 初始化第一个窗口
    for(int i = 0; i < k; i++)
        sum += nums[i];
    int max_val = sum;
    // 滑动窗口
    for(int i = k; i < nums.size(); i++)
    {
        sum = sum - nums[i - k] + nums[i];
        max_val = max(max_val, sum);
    }
    return max_val;
}

int main()
{
    vector<int> arr = {1,3,-1,2,5};
    cout << maxSumFixedWindow(arr,3);
    return 0;
}

四、可变长度滑动窗口(通用核心模板)

通用思路

  1. 右指针不断右移扩大窗口
  2. 窗口不满足条件时,左指针右移缩小窗口
  3. 过程中记录最优答案

模板框架

复制代码
int left = 0;
for(int right = 0; right < n; right++)
{
    // 1. 加入右边界元素,更新窗口状态

    // 2. 窗口不合法,收缩左边界
    while(窗口不满足条件)
    {
        // 移除左边界元素
        left++;
    }

    // 3. 记录最优答案
}

五、经典例题 1:最长无重复子串

复制代码
int lengthOfLongestSubstring(string s)
{
    int cnt[128] = {0};
    int left = 0, res = 0;
    for(int right = 0; right < s.size(); right++)
    {
        char c = s[right];
        cnt[c]++;
        // 出现重复字符,收缩左边界
        while(cnt[c] > 1)
        {
            cnt[s[left]]--;
            left++;
        }
        res = max(res, right - left + 1);
    }
    return res;
}

六、经典例题 2:最小子数组和大于目标值

复制代码
int minSubArrayLen(int target, vector<int>& nums)
{
    int left = 0, sum = 0;
    int res = 1e9;
    for(int right = 0; right < nums.size(); right++)
    {
        sum += nums[right];
        // 满足条件就尽量缩小窗口
        while(sum >= target)
        {
            res = min(res, right - left + 1);
            sum -= nums[left];
            left++;
        }
    }
    return res == 1e9 ? 0 : res;
}

七、滑动窗口使用禁忌

滑动窗口只适用于:区间具有单调性满足:窗口扩张条件变松,窗口收缩条件变紧不适用:元素正负杂乱、无单调规律题型

八、今日核心总结

  1. 滑动窗口依靠左右双指针,线性遍历高效解题
  2. 定长窗口变长窗口两类题型
  3. 右扩左缩,先扩后缩,动态维护合法区间
  4. 字符串子串、数组子数组、区间统计优先用滑动窗口
  5. 核心口诀:右指针无脑走,不合法左指针缩

九、课后练习

  1. 用固定窗口求数组内长度为 2 的最小和
  2. 手写最长无重复子串滑动窗口代码
  3. 自行实现最短子数组满足和大于给定值
相关推荐
咩咦2 小时前
C++学习笔记12:类和对象入门
c++·学习笔记·类和对象·封装·struct·class
渣渣苏2 小时前
硬核拆解 HNSW:亿级向量如何实现毫秒级召回?(上篇)
人工智能·算法·支持向量机·ai·向量数据库·hnsw·智能体
如竟没有火炬2 小时前
字符串相乘——int数组转字符串
开发语言·数据结构·python·算法·leetcode·深度优先
吃好睡好便好2 小时前
在Matlab中绘制三维等高线图
开发语言·python·学习·算法·matlab·信息可视化
天若有情6732 小时前
自制C++万能字符串流式库 formort.h|对标标准库endl,零拷贝链式拼接神器
开发语言·c++
项目申报小狂人2 小时前
一种使用双向长短时记忆网络结合鲸鱼优化算法的类火星矿物元素精确定量分析模型
人工智能·算法·lstm
wangjialelele2 小时前
【SystemV】基于建造者模式的信号量
linux·c语言·c++·算法·建造者模式
朔北之忘 Clancy3 小时前
2026 年 3 月青少年软编等考 C 语言一级真题解析
c语言·开发语言·c++·学习·青少年编程·题解·一级
Aaron15883 小时前
RFSOC+VU13P/VU9P+GPU多通道同步一体化解决方案
人工智能·嵌入式硬件·算法·matlab·fpga开发·硬件架构·基带工程