【Leet Code 】滑动窗口

前言

先思考一个问题:互动窗口的左右边界也是两个指针,也是一前一后一快一慢,滑动窗口和同向快慢指针核心区别在哪?

快慢指针的操作对象仅限于指针指向的两个元素,而滑动窗口通常要对窗口内的区间做统计。通常依赖哈希表。

239:滑动窗口最大值

题目要求:给定一个整数数组nums和整数k

要求:返回窗口大小位k中最大的数

核心思路

作为初入门滑动窗口,我们用暴力解法来实现

代码实现

java 复制代码
int n=nums.length;
if(n*k=0)return int[0];
if(k=1)return nums;

for(int i=0;i<n-k+1;i++){
int maxVal=nums[i];
for(int j=1;j<=k;j++){
maxVal=Math.max(maxVal,nums[i+j];
}
res[i]=maxVal;
}
return res;

总结

暴力解法:注意双层for循环的边界

3:无重复字符的最长字串

题目要求:给定一个字符串s

要求:找出其中不含重复字符的最长字串

核心思路

  1. 用两个指针left和right标识当前窗口[left,right)
  2. 用一个hashmap记录每个字符最后出现的位置
  3. 当右指针遇到重复字符时,左指针跳到重复字符的下一个位置,确保窗口内无重复
  4. 每次更新窗口长度,维护最大值

代码实现

java 复制代码
Map<Character,Integer> map=new HashMap<>();
int maxLen=0;
int left=0;

for(int right=0;right<s.length();right++){
Char c=s.charAt(right);
if(map.containsKey(c)){
left=Math.max(left,map.get(c)+1);
}
map.put(c,right);
maxLen=Math.max(maxLen,right-left+1);
}
return maxLen;

总结

要掌握本题的本质:掌握本题核心思路,注意left的更新细节

438:找到字符串中所有字母异位词

题目要求:给定两个字符串s与p

要求:找出s中所有p的异位词的起始索引

核心思路(滑动窗口+计数数组)

  1. 用两个数组pcount和scount记录p和当前窗口的字符出现次数
  2. 初始窗口长度=p.length()
  3. 窗口左移:右边加一个字符,左边减一个字符;每次判断两个计数数组是否 相等;如果相等说明当前窗口是异位词

代码实现

java 复制代码
class Solution {
    public List<Integer> findAnagrams(String s, String p) {
       List<Integer> res=new ArrayList<>();
       if(s.length()<p.length())return res;

       int[] pCount=new int[26];
       int[] sCount=new int[26];
       
       for(char c:p.toCharArray()){
        pCount[c-'a']++;
       }
       int lenP=p.length();
       for(int i=0;i<s.length();i++){
        sCount[s.charAt(i)-'a']++;

        if(i>=lenP){
            //移除窗口左边字符
            sCount[s.charAt(i-lenP)-'a']--;
        }
        if(Arrays.equals(pCount,sCount)){
            res.add(i-lenP+1);
        }
       }
       return res;
    }
}

总结

掌握这道题,需要:掌握本题解法思路;判断计数数组中元素是否相等的实现办法;注意移除窗口左边元素字符的实现方法,牵扯到获得pCount与sCount的统计方法的不同。

76:最小覆盖字串

题目要求:给定两个字符串s和t,

要求:在s中找出包含t所有字符的最小子串。

如果不存在:返回空字符串""。

如果有多个最小字串,返回任意一个。

核心思路

  1. 统计t中每个字符出现次数:用Map<Character,Integer>
  2. 右指针right扩展窗口
    不断加入sright,更新窗口内字符频率
    如果当前窗口满足条件
  3. 左指针left收缩窗口
    尽量缩小窗口,同时仍然包含t
    更新最小长度和起始索引
  4. 继续移动right,知道遍历完整个s

代码实现

209:长度最小的子数组

219:存在重复元素2

相关推荐
8Qi829 分钟前
LeetCode 516:最长回文子序列
算法·leetcode·职场和发展·动态规划
马士兵教育1 小时前
Java还有前景吗?Java+AI大模型学习路线及项目?
java·人工智能·python·学习·机器学习
youngerwang2 小时前
【从搬运工到协处理器:网卡芯片架构、算法、验证与边缘演进深度剖析】
网络·算法·架构·芯片
snow@li2 小时前
Java:理解 Gradle / 后端项目的管家 / 打包SpringBoot 应用 / 完成编译、下载依赖、运行测试、打包 JAR/WAR / 速查表
java
KaMeidebaby2 小时前
卡梅德生物技术快报|纯化重组蛋白实操详解
人工智能·python·tcp/ip·算法·机器学习
云烟成雨TD2 小时前
Spring AI 1.x 系列【57】动态工具发现:Tool Search Tool
java·人工智能·spring
zfoo-framework2 小时前
[修改代码使用]codex官方app中使用中转(不需要cc-switch) 1.config.toml 2.sk方式登录
java
逍遥德3 小时前
MQTT教程详解-05.SpringBoot集成mqtt client 性能分析
java·spring boot·spring·mt
云烟成雨TD3 小时前
Spring AI 1.x 系列【54】Retry 机制分析
java·人工智能·spring
weixin_523185323 小时前
Collections.unmodifiableMap详解:真的不可修改吗?
java·linux·前端