优选算法——滑动窗口

优选算法------滑动窗口

1.长度最小的子数组

解题原理

📋 解题步骤

第一步:理解题意

  • 找一个连续子数组,使其和 ≥ target,且长度最小
  • 数组元素都是正整数(关键性质)
  • 无解返回 0

第二步:分析暴力解法

  • 枚举所有子数组:O(n²) 或 O(n³)
  • 对于 n = 10⁵ 会超时

第三步:寻找优化点

  • 正整数 → 窗口扩展时和单调递增

  • 可以用滑动窗口优化

第四步:设计滑动窗口

复制代码
遍历右指针:
扩展窗口 从右边进窗口
判断: 如果 sum >= target:
更新最小长度
收缩窗口 从左边出窗口

第五步:手动模拟

步骤 left right 窗口 sum result
4 0 3 2,3,1,2 8 4
7 2 4 1,2,4 7 3
10 4 5 4,3 7 2

第六步:编写代码

cpp 复制代码
class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int len=INT_MAX;
        int n=nums.size();
        int sum=0;
        for(int left=0,right=0;right<n;right++)
        {
            sum+=nums[right];//进窗口
            while(sum>=target)//判断
            {
                len=min(len,right-left+1);
                sum-=nums[left++];
            }
        }
        return len==INT_MAX?0:len;
    }
};

第七步:验证边界

  • 单元素、无解、总和不足等情况

第八步:复杂度

  • 时间:O(n)
  • 空间:O(1)

2.无重复字符的最长子串

题目信息

  • 题目:LCR 016. 无重复字符的最长子串(与主站第3题相同)
  • 难度:中等
  • 标签:哈希表、字符串、滑动窗口

解法总结

方法 时间复杂度 空间复杂度
集合 O(n) O(min(n, 128))
哈希表 O(n) O(min(n, 128))
数组(推荐) O(n) O(1)

核心思路

滑动窗口法:

  1. 用双指针维护一个无重复字符的窗口

  2. 用哈希表/数组记录每个字符最后出现的位置

  3. 遇到重复字符时,左指针直接跳到重复字符的下一个位置

代码示例(C++ 最优解)

cpp 复制代码
class Solution {
public:

   int lengthOfLongestSubstring(string s) {
        int hash[128]={0};
        int ret=0;
        int n=s.size();
        for(int left=0,right=0;right<n;right++)
        {
            hash[s[right]]++;//进窗口
            while(hash[s[right]]>1)//判断
            {
                hash[s[left++]]--;//出窗口
            }
            ret=max(ret,right-left+1);
        }
        return ret;
    }
};
               hash[s[left++]]--;//出窗口
            }
            ret=max(ret,right-left+1);
        }
        return ret;
    }
};
相关推荐
会编程的小孩6 小时前
C++ qt的安装
c++
企业数字化笔记9 小时前
视频人体姿态怎么做三维可视化?2D关键点、深度局限与技术选型
人工智能·算法·音视频
?abc!9 小时前
(数组)581. 最短无序连续子数组
数据结构·算法·leetcode
小成2023032026512 小时前
C++~07补充
开发语言·c++
小郎君65812 小时前
MPTT树复选框的半选状态:一棵百万节点树从递归到计数器,再到区间覆盖
算法
酌沧12 小时前
MemT让记忆成为模型内生能力
jvm·人工智能·算法
hold?fish:palm12 小时前
40 二叉树的直径
c++·leetcode
Shimeri12 小时前
越卷越像:我用遗传算法做了个"内卷"实验
算法·three.js·数据可视化·遗传算法·进化算法
解决小子13 小时前
【虚幻引擎】【C++】【GAS框架】构建角色基类、属性集、数值钳制
c++·笔记·游戏引擎·虚幻·gas·能力系统
Evand J13 小时前
【PMSM例程1】永磁同步电机(PMSM)转速与转子电角度观测算法|基于扩展卡尔曼滤波(EKF)的传感器状态估计与误差。附下载链接
算法·电机·1024程序员节·卡尔曼滤波