滑动窗口双指针总结 c++代码

【蓝桥杯C/C++】代码性能提升技巧:算法选择 在竞赛中,算法的选择不仅决定了解题的正确性,还决定了程序的执行效率和资源使用情况。通过掌握贪心、分治、动态规划、双指针与滑动窗口、位运算、预处理等算法的特点、适用场景及优化技巧,我们可以在竞赛的严苛限制下写出更高效、更可靠的代码。 2024.11.20-✍ 阅读详情

算法框架

特点:i和j不会回退,区间向前交替扩大和收缩,就像一条向前慢慢蠕动的毛毛虫(bushi)

void slidingWindow(string s) {
    unordered_map<char, int> window;
    
    int left = 0, right = 0;
    while (right < s.size()) {
        // c 是将移入窗口的字符
        char c = s[right];
        window.add(c)
        // 增大窗口
        right++;
        // 具体分析
        printf("window: [%d, %d)\n", left, right);        
        // 判断左侧窗口是否要收缩
        while (left < right && window needs shrink) {
            // d 是将移出窗口的字符
            char d = s[left];
            window.remove(d)
            // 缩小窗口
            left++;
            // 具体分析
        }
    }
}

代码细节

debug时候主要是要回答三个问题

1、什么时候应该扩大窗口?

2、什么时候应该缩小窗口?

3、什么时候应该更新答案?

例题

最小覆盖子串

题面:返回 s 中涵盖 t 所有字符的最小子串

题解:暴力法:遍历所有子串,寻找最小的包含所有t中元素的子串

滑动窗口算法的思路是这样:

1、初始化 left = right = 0,把左闭右开区间 [left, right) 称为一个「窗口」。

使得一开始区间两个端点重合并且区间不包含任何元素

2、先增加 right 指针扩大窗口 ,直到窗口中的字符串包含了 T 中的所有字符。

3、停止 right,增加 left 指针缩小窗口 ,直到窗口中的字符串不再符合要求。每次增加 left,我们都要更新一轮结果。

4、重复第 2 和第 3 步,直到 right 到达字符串 S 的尽头。

string minWindow(string s, string t) {
    unordered_map<char, int> need, window;
    for (char c : t) need[c]++;//t中含有的字符

    int left = 0, right = 0;
    int valid = 0;

    int start = 0, len = INT_MAX;
    while (right < s.size()) {
 
        char c = s[right];
        // 扩大窗口
        right++;
        // 进行窗口内数据的一系列更新
        if (need.count(c)) {
            window[c]++;
            if (window[c] == need[c])
                valid++;
        }

        // 判断左侧窗口是否要收缩
        while (valid == need.size()) {
            // 在这里更新最小覆盖子串
            if (right - left < len) {
                start = left;
                len = right - left;
            }
            // d 是将移出窗口的字符
            char d = s[left];
            // 缩小窗口
            left++;
            // 进行窗口内数据的一系列更新
            if (need.count(d)) {
                if (window[d] == need[d])
                    valid--;
                window[d]--;
            }                    
        }
    }

    return len == INT_MAX ? "" : s.substr(start, len);
}

【C++算法:滑动窗口】809. 情感丰富的文字|1604 有时候人们会用重复写一些字母来表示额外的感受,比如 "hello" -> "heeellooo", "hi" -> "hiii"。我们将相邻字母都相同的一串字符定义为相同字母组,例如:"h", "eee", "ll", "ooo"。 对于一个给定的字符串 S ,如果另一个单词能够通过将一些字母组扩张从而使其和 S 相同,我们将这个单词定义为可扩张的(stretchy)。扩张操作定义如下:选择一个字母组(包含字母 c ),然后往其中添加相同的字母 c 使其长度达到 3 或以上。 例如,以 "hello" 为例 阅读详情

相关推荐

【C++滑动窗口】2653. 滑动子数组的美丽值|1785

给你一个长度为 n 的整数数组 nums ,请你求出每个长度为 k 的子数组的 美丽值 。 一个子数组的 美丽值 定义为:如果子数组中第 x 小整数 是 负数 ,那么美丽值为第 x 小的数,否则美丽值为 0 。 请你返回一个包含 n - k + 1 个整数的数组,依次 表示数组中从第一个下标开始,每个长度为 k 的子数组的 美丽值 。 子数组指的是数组中一段连续 非空 的元素序列。

闻缺陷则喜何志丹 1651

【25届秋招备战C++】算法篇-滑动窗口法(Sliding Window)

滑动窗口算法是一种在序列数据(如数组、字符串等)上执行特定操作的算法,它通过在序列上滑动一个固定大小的窗口来处理数据。这个窗口可以包含序列的一部分元素,并且随着算法的执行,窗口会沿着序列移动,主要用来减少while循环。滑动窗口算法的效率通常取决于窗口大小和序列长度。在最坏情况下,滑动窗口算法的时间复杂度为On\ O(n)On,其中n是序列的长度。

weixin_44791229的博客 1747

【C++滑动窗口】1248. 统计「优美子数组」|1623

给你一个整数数组 nums 和一个整数 k。如果某个连续子数组中恰好有 k 个奇数数字,我们就认为这个子数组是「优美子数组」。 请返回这个数组中 「优美子数组」 的数目。

闻缺陷则喜何志丹 1882

基础算法C++讲解(目前更新至:双指针+滑动窗口)

基础算法(竞赛必备)C++实现

weixin_72595637的博客 1153

【滑动窗口】P4085 [USACO17DEC] Haybale Feast G|普及+

题目描述 农夫约翰正在为他的奶牛准备一顿美味的晚餐!在他的谷仓里,他有 $N$ 个干草捆 $(1 \le N \le 10^5)$ 。第 $i$ 个干草捆有一定的风味 $F_i(1 \le F_i \le 10^9)$ 和一定的辣度 $S_i(1 \le S_i \le 10^9)$ 。 这顿饭将由一道菜组成,是一个连续的区间,包含一个或多个连续的干草捆(农夫约翰不能改变干草捆的顺序)。这顿饭的总体的风味是这段区间里风味的总和。这顿饭的总体辣度是区间中所有草包的最大辣度。 农夫约翰想确定他的这道菜所能

闻缺陷则喜何志丹 1686

【滑动窗口】P5057 [CQOI2006] 简单题

数字录音中,声音是用表示空气压力的数字序列描述的,序列中的每个值称为一个采样,每个采样之间间隔一定的时间。 很多声音处理任务都需要将录到的声音分成由静音隔开的几段非静音段。为了避免分成过多或者过少的非静音段,静音通常是这样定义的:$m$ 个采样的序列,该序列中采样的最大值和最小值之差不超过一个特定的阈值 $c$。 请你写一个程序,检测 $n$ 个采样中的静音。 ## 输入格式 第一行有三个整数 $n,m,c$($1\le n\le10^6$,$1\le m\le10^4$,$0\le c\le1

闻缺陷则喜何志丹 1381

算法基础提升——滑动窗口和单调栈(C++)

单调栈的目的是为了找到一个元素左边离它最近的且比它大的数及右边离它最近的且比它大的数。例如列表[8,5,4,6,7,],对于4来说,我们需要找到的是5和6;对于6来说,我们需要找到的是8和7。如果采用暴力方法,时间复杂度为,如果采用单调栈方法,时间复杂度为。单调栈也需要维持一个单调递减或递增的结构,若要求离某个数最近且比它大的数,使用栈底到栈顶单调减的结构;反之则使用单调增的结构。例如[5,4,3,6,1],求每个元素左边离它最近的且比它大的数及右边离它最近的且比它大的数,使用单调减结构。

Sebastian_Nova的博客 693

TMS-EEG数据预处理:eeglab工具包TESA(一)

b. 自动选择:Tools -> Reject data epochs -> Reject by probability,然后进行Plot -> channel,进行删除。TMS-EEG(经颅磁刺激-脑电图)是一种结合了TMS和EEG记录的技术,这种技术允许研究者在非侵入的情况下探测大脑环路,评估大脑的兴奋性和连通性等皮层特性。对移除脉冲伪迹的数据进行插值:Tools ->TESA -> Interpolate removed data;插值后,画图查看:数据会有数值;

weixin_43604817的博客 1486

双指针之滑动窗口

在 C++ 算法中,滑动窗口是一种经常用于解决数组或字符串的子数组或子串问题的技术。它通过维护一个窗口(通常是一个子区间),动态地调整窗口的起始位置和终止位置来解决问题。滑动窗口通常用于求解最大子数组和、最小子数组和、以及匹配特定条件的子串等问题。

m0_75068978的博客 586

元数据管理:DataHub和OpenMetadata对比分析

DataHub和OpenMetadata都试图解决数据编目,搜索,发现,治理和质量方面的相同问题。这两种工具都是出于为需要支持大量数据源、团队和用例的大型组织解决这些问题而诞生的。尽管这些工具在发布历史和成熟度方面略有不同,但它们的功能存在显着重叠。

weixin_38030820的博客 6622

合规批量下载美国上市公司年报数据的一些经验和总结

本文总结了使用Python脚本批量下载和处理美国上市公司SEC报告的技术经验。通过CIK代码查询SEC EDGAR系统,生成特定日期和报告类型的URL,并使用Selenium和Requests库下载报告内容。流程包括数据获取、文件下载、Excel处理和多线程优化,确保高效处理几百条数据。关键技术挑战包括SEC访问限制、动态网页内容和数据完整性,解决方案包括设置合规的User-Agent、使用Selenium模拟浏览器行为以及错误日志记录。最佳实践包括模块化设计、多线程优化和严格遵守SEC合规性。该自动化流程

jyfool的博客 1628

双指针 滑动窗口总结

双指针,滑动窗口的总结博客

icebeeeeeef的博客 745

保姆级教程:在ESXi 8.0上为NVIDIA ConnectX-5/6网卡开启SR-IOV(从BIOS到虚拟机配置)

本文提供在ESXi 8.0上为NVIDIA ConnectX-5/6网卡开启SR-IOV的详细教程,涵盖BIOS设置、固件配置、驱动优化及虚拟机部署。通过SR-IOV技术,显著提升虚拟化环境中的网络性能,适用于高性能计算、AI训练等场景。

weixin_26934905的博客 451

滑动窗口双指针技巧:C++ 代码实现与LeetCode经典题解

本文系统介绍了滑动窗口算法的核心原理及其在字符串和数组问题中的应用。该算法通过维护动态窗口(双指针)高效解决子区间问题,时间复杂度通常为O(n)。文章详细解析了8个经典LeetCode题目,包括最小覆盖子串、无重复字符最长子串等,涵盖固定窗口和变长窗口两种类型。每个题目提供暴力解法和滑动窗口优化解法对比,重点讲解哈希表优化、count变量计数等核心技巧,并给出通用解题模板。滑动窗口算法能有效降低时间复杂度,是处理连续子区间问题的利器,掌握其原理和实现细节对算法能力提升至关重要。

m0_68447088的博客 398

DFT笔记 DC/AC mode与Func

DFT scan可以分为DC和AC两种,区别如下图。

m0_61544122的博客 5697

Pyhon在振动信号处理中的高级应用(一):振动信号特征(时域、频域)提取

文章目录一、概述二、算法原理2.1 时域统计特征三、python代码实现 一、概述 二、算法原理   这里我们借鉴西安交通大学机械学院雷教授的论文《Fault diagnosis of rotating machinery based on multiple ANFIS combination with GAs》相关研究成果。雷教授在论文中共列举了4类共24种振动信号的时域和频域特征。 2.1 时域统计特征 p1=∑n=1Nx(n)NP2=∑n=1N(x(n)−p1)2N−1p3=(∑n=1N∣x(n)∣N

白银时代的博客 1万+

基础算法--双指针【概念+图解+题解+解释】

双指针技术是一种高效且灵活的算法策略,对于多种问题都可以应用。在使用双指针时,理解问题的结构及条件是至关重要的。熟练掌握滑动窗口和快慢指针后,可以解决很多典型算法问题。

Stark的博客 1596

【AI智能体】Dify 搭建个人专属简历美化助手操作详解

Dify 搭建个人专属简历诊断助手实战操作详解

congge 4371

双指针,滑动窗口

题解:我们完全可以用滑动窗口的思想,去用两个指针去维护一个区间范围,左指针固定不动,移动右指针,直到右指针移动到的位置,能够把每一个画家的画作都囊括,然后慢慢移动左指针,如果当左指针目前位置,在这个区间内出现过两次,那么就可以减少一下长度,然后反复和我们自己设定的minn最小长度进行比较,直到找出最短长度。今天也是闲来无事,想去做一下,之前学过的某个题型,但是在中间突然发现了这个题,那时候年少无知,做不出来,今天也是很轻松的用双指针轻松拿捏,因此发帖。

2301_80475191的博客 305

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【C++滑动窗口】1004. 最大连续1的个数 III|1655

最大连续1的个数

闻缺陷则喜何志丹 612

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

滑动窗口最大值

题目描述 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,...

weixin_30768175的博客 120

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

【C++算法】9.滑动窗口_长度最小的子数组

求和的时候,可以把上次求和的结果存起来,往后加一位的时候直接把那一位的值加到上次的和里面。,使用同向双指针来优化。(同向双指针也叫滑动窗口)来记录,每次判断后先更新结果,然后出窗口。继续往后得到的都不是长度最小的数组了。解法一:暴力求解(会超时)暴力枚举出所有子数组的和。解法一:暴力求解(会超时)然后窗口的长度可以用。

hlyd520的博客 1297

c++算法一

本文总结了双指针、滑动窗口、二分查找和前缀和等算法技巧的应用场景和解题思路。双指针常用于处理数组中的覆盖、环检测、单调性问题,如复写0、快乐数、盛水容器等。滑动窗口适用于寻找符合条件的子区间,如最小长度子区间、无重复字符子串等。二分查找适用于具有二段性的数组,如查找元素位置、算术平方根、峰值等。前缀和用于快速计算连续区间的和或积,如中心下标、子数组和、矩阵区域和等。每种技巧都通过具体题目进行了详细解析,并提供了代码实现的注意事项。

DXY798的博客 1242

代码随想录笔记|C++数据结构与算法学习笔记-数组(二)|双指针、滑动窗口、模拟行为(循环不变量原则的应用)

本文基于代码随想录,写入一些自己的想法。

糖炒栗子 933

代码随想录算法训练营第二天 | LeetCode977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II

今天的内容依旧为对数组进行操作。

cattte的博客 1325
上一篇: SMART规则-如何制定一个好的工作规划
下一篇: 西山居SEED训练营游戏策划笔试
就这样吧散了吧
博客等级 码龄4年 998粉丝 151原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值