LeetCode Hot 100:滑动窗口

LeetCode Hot100字串题解:滑动窗口与KMP算法实战 字符串处理是算法面试中的核心考察点,涉及基础操作到高级算法的完整知识体系。滑动窗口技术通过维护动态区间高效解决子串问题,其核心在于双指针移动与哈希表记录。KMP算法则利用next数组实现模式串的快速匹配,避免不必要的回溯。这些技术在文本搜索、数据压缩等领域有广泛应用。本文以LeetCode Hot100高频字串题为例,详解滑动窗口解决无重复字符子串问题,以及KMP算法在strStr实现中的工程实践,提供可直接复用的代码模板与优化技巧。 阅读详情

LeetCode Hot 100:滑动窗口

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

思路 1:滑动窗口 + 哈希表

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int n = s.length();
        int maxLen = 0;
        unordered_set<char> hashSet;
        for (int left = 0, right = 0; right < n; right++) {
            while (hashSet.count(s[right])) {
                hashSet.erase(s[left]);
                left++;
            }
            hashSet.insert(s[right]);
            maxLen = max(maxLen, right - left + 1);
        }
        return maxLen;
    }
};

思路 2:动态规划 + 哈希表

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int n = s.length();
        unordered_map<char, int> dic;
        int res = 0, tmp = 0;
        for (int left, right = 0; right < n; right++) {
            if (dic.find(s[right]) == dic.end())
                left = -1;
            else
                left = dic.find(s[right])->second; // 获取索引 i
            // 更新哈希表
            dic[s[right]] = right;
            // dp[j - 1] -> dp[j]
            tmp = tmp < right - left ? tmp + 1 : right - left;
            res = max(res, tmp);
        }
        return res;
    }
};

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

思路 1:固定长度滑动窗口 + 哈希表

class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
        int sLen = s.length(), pLen = p.length();
        if (sLen < pLen)
            return {};

        vector<int> sCount(26, 0), pCount(26, 0);
        vector<int> ans;

        for (int i = 0; i < pLen; i++) {
            sCount[s[i] - 'a']++;
            pCount[p[i] - 'a']++;
        }

        if (sCount == pCount)
            ans.push_back(0);

        for (int i = pLen; i < sLen; i++) {
            sCount[s[i - pLen] - 'a']--;
            sCount[s[i] - 'a']++;
            if (sCount == pCount)
            {
                // 子串开头是 i - pLen + 1
                ans.push_back(i - pLen + 1);
            }
        }
        return ans;
    }
};

思路 2:可变长度滑动窗口 + 哈希表

class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
        int sLen = s.length(), pLen = p.length();
        if (sLen < pLen)
            return {};

        vector<int> sCount(26, 0), pCount(26, 0);
        vector<int> ans;

        for (int i = 0; i < pLen; i++)
            pCount[p[i] - 'a']++;

        if (sCount == pCount)
            ans.push_back(0);

        for (int left = 0, right = 0; right < sLen; right++) {
            sCount[s[right] - 'a']++;
            while (sCount[s[right] - 'a'] > pCount[s[right] - 'a']) {
                sCount[s[left] - 'a']--;
                left++;
            }
            if (right - left + 1 == pLen)
                ans.push_back(left);
        }

        return ans;
    }
};
力扣hot100第11题:滑动窗口最大值python 摘要:本文探讨了滑动窗口最大值问题的两种解法。第一种简单解法通过维护滑动窗口列表并使用max()函数求最大值,时间复杂度为O(nk)。第二种优化解法采用双端队列,存储元素索引并保持单调递减特性,将时间复杂度降至O(n)。文章详细解析了双端队列的实现逻辑,包括移除过期索引、维护单调性、添加新索引和记录最大值四个步骤,并通过示例数组[1,3,-1,-3,5,3,6,7]逐步演示了算法执行过程,最终输出正确结果[3,3,5,5,6,7]。 阅读详情

相关推荐

C++ bitset总结

数据结构bitset 术语:某1位置位是置1,某一位复位是某一位清零。 文章目录数据结构bitset一、3种初始化方式二、位访问三、位操作四、 位集操作总结实战练习 一、3种初始化方式 bitset<32> tmp; //默认构造函数,默认全0。 bitset<32> tmp(-1); //从整形数构造 bitset<32> tmp("101"); //从包含1和0的字符串构造 二、位访问 bitset<32> tmp(256)

qq_43807092的博客 721

C++刷LeetCode Hot100:双指针与滑动窗口实战

双指针和滑动窗口是算法中的核心技巧,广泛应用于数组和链表问题。双指针通过维护两个指针变量,能在O(n)时间复杂度内解决搜索、去重等问题,常见模式包括同向指针、相向指针和快慢指针。滑动窗口则擅长处理子串/子数组问题,通过动态调整窗口边界来优化计算效率。在C++实现中,这些算法能充分发挥性能优势,配合STL容器和内存管理特性,适合解决LeetCode高频题目如三数之和、最小覆盖子串等。掌握这些技巧不仅能提升算法能力,还能深入理解计算机底层的内存操作机制。

weixin_33980459的博客 414

Jetson Nano系统重装的艺术:从格式化到烧录的深度解析

本文详细解析了Jetson Nano系统重装的完整流程,从SD卡格式化到系统镜像烧录的进阶技巧,包括硬件选择、软件准备、常见问题处理及深度学习环境配置。特别推荐使用三星EVO Plus SD卡和官方电源以确保稳定性,适合开发者快速掌握嵌入式设备系统重装的核心技术。

weixin_28273593的博客 610

[LeetCode力扣hot100]-滑动窗口-例:无重复字符的最长子串

如上图,核心思想就是满足条件的话,让黑色指针右移动;当黑色指针无法移动时,白色指针移动,白指针移动后如果黑色能移动就移动黑色。(0914学习了滑动窗口概念和set用法后才做出来了,需要再练),注意其中的set用法。同类题,只不过字符串换成了数组,上面一道能做出来这道题也能做出来。同时,为了满足这种关系,需要用到set数据结构(不可有重复元素)ans.count()//检查某个元素是否在set里,1在0不在。题目链接在开头,做为面试常见手撕题,必须要会做。字节飞书面经里的高频题,没做出来,需要好好复习。

m0_62237233的博客 588

给粒子物理萌新的Geant4保姆级入门:从看懂B1示例代码到跑通第一个模拟

本文为粒子物理初学者提供Geant4的保姆级入门指南,从解析B1示例代码到跑通第一个模拟。详细介绍了环境准备、代码解析、可视化系统实战及扩展模拟的方法,帮助新手快速掌握Geant4的基本概念和工具包使用。

weixin_29231725的博客 500

凌欧通用FOC框架解析(5.程序环流程)

结构体:电流内环.这是一个结构体函数占空比13.

weixin_43756295的博客 2934

LeetCode HOT100刷题笔记(二):滑动窗口,数组

ps:笔记和代码按本人理解整理,重思路

学习记录 921

雨流计数法的matlab实现,采用三点法与四点法

介绍雨流计数法是20世纪50年代由英国的两位工程师M.Matsuishi和T.Endo提出来的。该计数法的主要功能是把实测载荷历程简化为若干个载荷循环,供疲劳寿命估算和编制疲劳试验载荷谱使用。它以双参数法为基础,考虑了动强度(幅值)和静强度(均值)两个变量,符合疲劳载荷本身固有的特性。雨流计数法主要用于工程界,特别在疲劳寿命计算中运用非常广泛计数规则(1)雨流依次从载荷时间历程的峰值位置的内侧沿着...

u011391128的博客 3万+

LeetCode 热题 HOT 100:滑动窗口专题

题目包含:无重复字符的最长子串、最长连续序列、滑动窗口最大值、找到字符串中所有字母异位词

秀岩的博客 681

fragstats:景观指数趋势分析

优快云@_养乐多_本文将介绍景观指数时间序列的趋势分析,包括趋势类型、斜率、截距等。以及景观指数突变分析所用的软件和 python 代码。结果如下图所示,

养乐多的博客 2860

Dify智能体开发:发布嵌入网站

Dify 支持将你的 AI 应用嵌入到业务网站中,你可以使用该能力在几分钟内制作具有业务数据的官网 AI 客服、业务知识问答等应用。点击 WebApp 卡片上的嵌入按钮,复制嵌入代码,粘贴到你网站的目标位置。

王国平的博客 3244

LeetCode 热题 HOT100(二):双指针进阶与滑动窗口(Go 实现)

(欢迎来访)✨本文覆盖力扣「热题 100」学习计划第 6~10 题,全部使用实现。可与上一篇(哈希表与双指针入门)对照阅读。

lihaoweiwudi_的博客 2407

i.MX6ULL系统移植 | 使用busybox制作根文件系统(1.29.0)

一. 下载BusyBox BusyBox是一个继承了大量Linux命令核工具的软件,像常用的ls、cp、mv、ifconfig等命令。一般下载BusyBox的源码,然后配置Busybox,选择自己想要的功能,最后编译即可。 BusyBox在官方可以直接下载:https://www.busybox.net/。目前最新是1.35.0,这里我使用1.29.0版本。 axel https://www.busybox.net/downloads/busybox-1.29.0.tar.bz2 下载之后解压: tar

Mculover666的博客(嵌入式) 1145

前端力扣刷题 | 3:hot100之 滑动窗口

给定两个字符串 s 和 p,找到 s 中所有 p 的异位词的子串,返回这些子串的起始索引。不考虑答案输出的顺序。起始索引等于 0 的子串是 “cba”, 它是 “abc” 的异位词。起始索引等于 6 的子串是 “bac”, 它是 “abc” 的异位词。给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串的长度。解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。输入: s = “cbaebabacd”, p = “abc”输入: s = “abcabcbb”

2502_90366796的博客 471

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

力扣hot100:滑动窗口——找到字符串中所有字母异位词

力扣hot100:滑动窗口——找到字符串中所有字母异位词

ml29895063的博客 432

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

力扣HOT100之子串:239. 滑动窗口最大值

感觉自己当时写的逻辑比较通俗易懂,这一次我看的灵神的题解,也是用单调队列做出来的,但是不像上一次定义了那么多函数,但是感觉不如上一次的思路好懂。窗口长度有限,在经历上一步之后,队列中的元素个数可能超出窗口大小,所以需要对队列中的元素个数进行判断,由于加入的是第i个元素,因此我们直接判断。时才会触发这个结果,由于队首元素就是队列内的最大值,因此我们直接将队首中存储的下标对应的元素存入结果向量即可。二是判断队尾元素是否。右端元素,若满足,则需要不断将队尾元素弹出,直到队尾元素。若满足,则需要将队首元素弹出。

weixin_52151595的博客 494

【力扣hot100:239. 滑动窗口最大值】

因为每个下标最多入队出队一次,整个过程中总次数最多不超过2n次,这是线性的,所以总时间复杂度是。维护一个大顶堆,用定长滑动窗口的写法,大顶堆的顶部就是最大值,可以直接通过。加上外层循环执行 n 次,总复杂度变为。但是这个方法是会超时的,超时的原因在于。循环,但是这个方法的时间复杂度不是。需要线性查找元素,时间复杂度是。如果这篇文章对你有帮助,欢迎。你们的支持是我前进的动力!虽然这个方法里面也嵌套了。

DdigitalNomad的博客 292

LeetCode hot100高频题解析:双指针与滑动窗口的实战应用

本文深入解析了LeetCode hot100高频题中双指针与滑动窗口两大核心算法的实战应用。通过剖析“移动零”、“盛最多水的容器”、“无重复字符的最长子串”等经典题目,揭示了如何利用双指针实现O(n)时间复杂度优化,以及滑动窗口如何高效处理连续子区间问题,旨在帮助开发者掌握算法精髓,提升面试与解题能力。

weixin_29309213的博客 217

leetcode-hot100-python-专题三:滑动窗口

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串的长度。示例 1:输入: s = “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3示例 2:输入: s = “bbbbb” 输出: 1 解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。示例 3:输入: s = “pwwkew” 输出: 3 解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。

2301_78696436的博客 380

力扣HOT100之滑动窗口:438. 找到字符串中所有字母异位词

当两个哈希表不相等时,则说明当前滑动窗口框住的不是异位词,需要直接将滑动窗口右移,所以我们需要及时将窗口左端的元素移除,在下个循环中,滑动窗口右端会新增一个元素,这样就维持了滑动窗口的长度不变。作为哈希表的数据结构,注意,当删除窗口左端的元素时,如果窗口左端的元素计数已经降为0,则将对应的键删除,若不及时删除的话,该键依然会存在于哈希表中,但是滑动窗口内已经没有这个字符了,这就会影响两个哈希表之间的相等判断,即使后面的滑动窗口已经框住了异位词,但由于其他字符的键没有删干净,而导致二者不相等,从而漏掉答案。

weixin_52151595的博客 468

leetcode-hot100-子串:560和为 K 的子数组-239滑动窗口最大值-76最小覆盖子串

子串:560和为 K 的子数组-239滑动窗口最大值-76最小覆盖子串

XSYaaaaan的博客 417

【力扣hot100】子串专题:暴力、前缀和、滑动窗口与单调队列

本文介绍了三个子串相关算法题的解题思路: 和为K的子数组(560题): 暴力解法通过双重循环枚举所有子数组,时间复杂度O(n²) 优化解法使用前缀和+哈希表,将问题转化为查找pre[j-1]=pre[i]-k,时间复杂度O(n) 滑动窗口最大值(239题): 使用单调队列维护窗口内的递减序列 队列头始终是当前窗口最大值,通过淘汰不可能成为最大值的元素来优化 最小覆盖子串(76题): 滑动窗口经典应用,右扩找可行解,左缩找最优解 使用双指针和哈希表统计字符出现次数,确保窗口涵盖目标字符串的所有字符 这些题目展

2401_87144364的博客 277

力扣HOT100之滑动窗口:3. 无重复字符的最长子串

类型,然后我们需要定义左右指针,分别指向窗口的左端元素和右端元素,在初始状态下,左指针和右指针指向同一个元素(字符串s的第一个字符),然后使用一个for循环来移动右指针,只要右指针指向的字符在子串中的个数。循环来将左指针右移,并同时将左指针指向的字符数量-1,当左指针遍历到重复字符时,先将该字符的数量-1,再将左指针右移一位,此时子串中不再包含重复字符,退出。,就不断将右指针右移,并且更新最长无重复子串的长度,如果遇到right指针指向的字符在子串中的数量。,则说明已经出现了重复字符,则通过一个。

weixin_52151595的博客 284

力扣hot100:滑动窗口:438.找到字符串中所有字母异位词

首先将子串内的字母出现频率记录,然后开始从头遍历字符串,向右边添加元素一直到滑动窗口的长度,并且比较滑动窗口内字母出现频率是否与子串字母出现频率相同,相同则计算滑动窗口起始下标。时间复杂度为O(n),仅仅遍历了一遍数组。核心思路:利用滑动窗口内字母出现频率与子串相比较,如果一样则返回窗口起始下标。1、 固定长度滑动窗口(如:查找所有长度为 k 的子串)2、动态大小滑动窗口(如:最小覆盖子串)处理窗口中的数据并判断。右指针不断向右扩展窗口。左指针根据条件收缩窗口。每次向右滑动一个字符。直到满足或不满足条件。

2401_83606094的博客 218

【LeetCode HOT100 】:最小覆盖子串——滑动窗口的经典应用题解

valid的含义:代表已满足数量要求的字符种类数,而非字符总数。当某字符的窗口计数恰好等于需求计数时才增加valid。窗口收缩条件:必须使用while而非if,因为收缩后窗口可能仍然满足覆盖条件,需要持续收缩。边界处理:当min_len仍为无穷大时,返回空字符串。字符重复处理t中可能包含重复字符(如"aa"),需要确保窗口中有至少两个'a'。

Mr_pyx的博客 368

Leetcode Hot 100系列:滑动窗口最大值(Q239)

要明白本题其实就是在维护一个单调队列,因为要找的就是滑动窗口的最大值,所以我们其实只需要做两件事情,一个是维护队列中的元素都在滑动窗口内,一个是队列中的元素要按从大到小排列,因为小的元素在窗口移动的过程中永远不会成为最大值。

m0_73965192的博客 533
上一篇: LeetCode Hot 100:普通数组
下一篇: LeetCode Hot 100:子串
UestcXiye
博客等级 码龄8年 9030粉丝 1306原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

UestcXiye

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

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

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

打赏作者

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

抵扣说明:

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

余额充值