滑动窗口算法模板

这里摘抄《labuladong的算法小抄》中的一首小诗(东哥大才):

滑动窗口防滑记

链表子串数组题,用双指针别犹豫。双指针家三兄弟,各个都是万人迷。

快慢指针最神奇,链表操作无压力。归并排序找中点,链表成环搞判定。

左右指针最常见,左右两端相向行。反转数组要靠它,二分搜索是弟弟。

滑动窗口最困难,子串问题全靠它。左右指针滑窗口,一前一后齐头进。

labuladong稳若”狗“,一套框架不翻车。一路漂移带闪电,算法变成默写题。

滑动窗口算法技巧的思路非常简单,就是维护一个窗口,不断滑动,然后更新答案。该算法的大致逻辑如下:

        int left = 0, right = 0;

        while (right < s.size()) {

                // 增大窗口

                window.add(s[right]);

                right++;

                while (window needs shrink) {

                        // 缩小窗口

                        window.remove(s[left]);

                        left++;

                }

        }

这个算法的时间复杂度是O(N),比字符串暴力算法要高效得多。下面是东哥的一套滑动窗口算法的代码框架,连在哪里做输出 debug 都写好了,以后遇到相关的问题,就默写出来如下框架然后修改两个地方就行,还不会出 bug:

package SlidingWindow;import java.util.HashMap;
import java.util.Map;// 算法模板—滑动窗口
public class AlgorithmTemplate {public void slidingWindow(String s, String t) {Map<Character, Integer> need = new HashMap<>();Map<Character, Integer> window = new HashMap<>();for (int i = 0; i < t.length(); i++) {char key = t.charAt(i);need.put(key, need.getOrDefault(key, 0) + 1);}int left = 0, right = 0, valid = 0;while (right < s.length()) {// c 是将要移入窗口的字符char c = s.charAt(right);// 右移窗口right++;// 进行窗口内数据的一系列更新System.out.println("进行窗口内数据的一系列更新");/*** debug 输出的位置***/System.out.println("window:(" + left + ", " + right + ")");/*********************/// 判断左侧窗口是否要收缩while (true) { // window need shrink —窗口需要收缩// d 是将要移出窗口的字符char d = s.charAt(left);// 左移窗口left++;// 进行窗口内数据的一系列更新System.out.println("进行窗口内数据的一系列更新");}}}
}

其中两处 sout 表示更新窗口数据的地方,直接往里面填具体逻辑就行了。而且,这两处操作分别是右移和左移窗口更新操作,它们的操作是完全对称的。稍后,我会用4道力扣原题来套这个框架。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/53830.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何自学SQL(从入门到精通)?

SQL语言对于各个数据库是通用的&#xff0c;学习SQL数据库语言是一个系统的过程&#xff0c;可以分为几个阶段&#xff1a;入门、进阶、实践和精通。 下面是一些建议&#xff0c;可以帮助你从入门到精通自学SQL&#xff1a; 1. 学习方法 a. 理解基本概念 数据库理论&#xf…

MinIO【部署 02】Linux集群版本及Windows单机版、单机多目录版、分布式版(cmd启动脚本及winsw脚本分享)

Linux集群版及Windows单机版分布式版 1.Linux集群版1.1 安装启动停止1.2 将MinIO添加到服务 2.Windows2.1 官网安装2.2 本地测试2.2.1 cmd启动脚本2.2.2 winsw脚本 3.总结 1.Linux集群版 官网下载地址 https://min.io/download#/linux&#xff1b; 官网安装文档 https://min.i…

rk3568 parameter.txt 添加自己的分区,或者去掉已有的分区

问题&#xff1a; 客户在 之前的核心板上 可以烧写自己的镜像&#xff0c;但是在最新的核心板上却烧写不上&#xff0c;新旧核心板 只是变了emmc &#xff0c; 由 江波龙 ------->星火。 分析&#xff1a; 客户的镜像的分区是经过自己的定制的&#xff0c;所以有可能 是 由…

iPhone 16预售已开,沙漠金色最抢手,喜提新机后别忘了这件事!

9月13日20点&#xff0c;iPhone 16系列正式开启官方预购。今年全新的iphone16不仅新增相机按钮和AI功能&#xff0c;还增加了沙漠金配色。“加量不加价”的iPhone 16系列开售依旧火爆&#xff0c;iPhone 16系列开售1分钟内&#xff0c;苹果官方网站一度被消费者买到崩&#xff…

P4779 【模板】单源最短路径(堆优化dijkstra)

堆优化dijkstra&#xff0c;时间复杂度&#xff0c;我个人写习惯的模版。 #include<bits/stdc.h> using namespace std; #define PII pair<int,int> #define fi first #define se second const int N2e510;int read(){int x0,f1;char chgetchar();while(!isdigit(…

html+css+js网页设计 旅游 龙门石窟4个页面

htmlcssjs网页设计 旅游 龙门石窟4个页面 网页作品代码简单&#xff0c;可使用任意HTML辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 获取源码 1&#…

用Kimi输出流程图

1.输入 我希望设计一个ERP系统&#xff0c;请帮我简单列一个流程图&#xff0c;用mermaid输出2.输出

vue事件传参

只有事件没有其他参数时,直接使用参数e <script> export default {data() {return {count

深入理解Java虚拟机:Jvm总结-虚拟机字节码执行引擎

第八章 虚拟机字节码执行引擎 8.1 意义 不受物理条件制约地定制指令集与执行引擎的结构体系&#xff0c;能够执行那些不被硬件直接支持的指令集格式。输入的是字节码二进制流&#xff0c;处理过程是字节码解析执行的等效过程&#xff0c;输出的是执行结果 8.2 运行时栈帧结构…

git如何灵活切换本地账号对应远程github的两个账号

git如何灵活切换本地账号对应远程github的两个账号 问题&#xff1a; 有时候我们会同时维护两个github的账号里面的仓库内容&#xff0c;这时候本地git需要频繁的切换ssh&#xff0c;以方便灵活的与两个账号的仓库可以通信。这篇日记将阐述我是怎么解决这个问题的。1. 第一个账…

通过HTforWeb在ARMxy边缘计算网关上实现工业互联网

随着工业互联网技术的不断进步和发展&#xff0c;企业越来越重视通过数字化手段提高生产效率、降低成本并增强竞争力。ARMxy BL340系列作为一款高性能的工业级ARM嵌入式计算机&#xff0c;为实现这些目标提供了坚实的硬件基础。而HTforWeb作为一款专业的前端开发工具&#xff0…

神经网络学习笔记——如何设计、实现并训练一个标准的前馈神经网络

1.从零设计并训练一个神经网络https://www.bilibili.com/video/BV134421U77t/?spm_id_from333.337.search-card.all.click&vd_source0b1f472915ac9cb9cdccb8658d6c2e69 一、如何设计、实现并训练一个标准的前馈神经网络&#xff0c;用于手写数字图像的分类&#xff0c;重…

九、外观模式

外观模式&#xff08;Facade Pattern&#xff09;是一种结构型设计模式&#xff0c;有叫门面模式&#xff0c;它为一个复杂子系统提供一个简单的接口&#xff0c;隐藏系统的复杂性。通过使用外观模式&#xff0c;客户端可以更方便地和复杂的系统进行交互&#xff0c;而无需直接…

【Android】【Bug】Activity全屏(保留底部按钮)被打断变成非全屏了

问题 在Activity里面设置全屏显示(保留底部按钮的全屏)&#xff0c;刚开始的时候显示的也是全屏&#xff0c;但是在此页面进行一些操作之后&#xff0c;全屏变成非全屏了。 全屏设置方法 在 Activity 中的 onCreate 方法里&#xff0c;添加以下代码&#xff1a; Override p…

微信文件处理与命名机制分析(基于微信 8.0.50 版本)

微信文件处理与命名机制分析&#xff08;基于微信 8.0.50 版本&#xff09; 摘要 微信作为一款广泛使用的即时通讯工具&#xff0c;涉及图片、视频、文档等多种文件类型的传输与管理。本文基于微信 8.0.50 版本&#xff0c;探讨其对于图片、GIF、视频等文件的命名处理策略&am…

数据驱动的生态系统架构:打造智能化管理与业务增长的未来战略

在当今的数字化经济中&#xff0c;数据已成为企业最具战略价值的资产。通过数据的分析与应用&#xff0c;企业不仅能够提高业务效率&#xff0c;还能通过构建数据驱动的生态系统架构&#xff0c;实现跨行业协作与技术创新&#xff0c;最终提升全球竞争力。2024年生态系统架构可…

SpringBoot Jar 包加密防止反编译实战

今天给大家分享一个 SpringBoot 程序 Jar 包加密的方式&#xff0c;通过代码加密可以实现无法反编译。 应用场景就是当需要把公司的产品部署到友方公司或者其他公司时&#xff0c;可以防止客户直接反编译出来源码&#xff0c;大大提升代码的安全性。 版本 springboot 2.6.8j…

RuoYi 开源框架,集成了后端管理,后端java版 App 移动解决方案

文章目录 前言一、后端&#xff1a;二、后台管理三、App 移动总结 前言 后端&#xff1a; 后台管理&#xff1a; 使用的前端技术Vue、Element后端SpringBoot & Security完全分离的权限管理系统。 App 移动解决方案&#xff1a;采用uniapp框架 提示&#xff1a;以下是本篇文…

Java后端编程语言进阶篇

第一章 函数式接口 函数式接口是Java 8中引入的一个新特性&#xff0c;只包含一个抽象方法的接口。 函数式接口可以使用Lambda表达式来实现&#xff0c;从而实现函数式编程的特性。 使用 FunctionalInterface标识接口是函数式接口&#xff0c;编译器才会检查接口是否符合函数…

Qt 实现自定义截图工具

目录 Qt 实现自定义截图工具实现效果图PrintScreen 类介绍PrintScreen 类的主要特性 逐步实现第一步&#xff1a;类定义第二步&#xff1a;初始化截图窗口第三步&#xff1a;处理鼠标事件第四步&#xff1a;计算截图区域第五步&#xff1a;捕获和保存图像 完整代码PrintScreen.…