当前位置: 首页 > news >正文

刷题笔记 - 滑动窗口

文章目录

    • 滑动窗口
      • 最长无重复子串
      • 最小覆盖子串
      • 串联所有单词的子串
      • 长度最小的子数组
      • 滑动窗口最大值
      • 字符串的排列
      • 最小区间

滑动窗口

所有题目来自leetcode的回答:https://leetcode.cn/problems/longest-substring-without-repeating-characters/solutions/3982/hua-dong-chuang-kou-by-powcai

会员题没有列出来。

最长无重复子串

题目:https://leetcode.cn/problems/longest-substring-without-repeating-characters/description/

class Solution {public int lengthOfLongestSubstring(String s) {int n = s.length();if (n == 0) return 0;Map<Character, Integer> map = new HashMap<>();int res = 0, left = 0;for (int i = 0; i < n; i ++) {if (map.containsKey(s.charAt(i))) {left = Math.max(left, map.get(s.charAt(i)) + 1);}map.put(s.charAt(i), i);res = Math.max(res, i - left  + 1);}return res;}
}

最小覆盖子串

题目:https://leetcode.cn/problems/minimum-window-substring/description/

class Solution {Map<Character, Integer> cnts = new HashMap<>();Map<Character, Integer> cntt = new HashMap<>();public String minWindow(String s, String t) {int ls = s.length(), lt = t.length();int milen = Integer.MAX_VALUE, st = 0,  ed = 0, mist = 0, mied = 0;boolean isNull = false;for (int i = 0 ; i < lt; i ++) {cntt.put(t.charAt(i), cntt.getOrDefault(t.charAt(i), 0) + 1);}while (ed < ls) {if (cntt.containsKey(s.charAt(ed))) {cnts.put(s.charAt(ed), cnts.getOrDefault(s.charAt(ed), 0) + 1);while (check()) {  // 这里是while,一步更新到第二个在cntt里的字符,过滤掉无用字符isNull = true;if (milen > ed - st + 1) {milen = ed - st + 1;mist = st;mied = ed;}if (cntt.containsKey(s.charAt(st))) {cnts.put(s.charAt(st), cnts.getOrDefault(s.charAt(st), 0) - 1);}st ++;}}ed ++;}if (!isNull) return "";return s.substring(mist, mied + 1);}private boolean check() {Iterator iter = cntt.entrySet().iterator();while (iter.hasNext()) {Map.Entry entry = (Map.Entry) iter.next();Character key = (Character) entry.getKey();Integer val = (Integer) entry.getValue();if (cnts.getOrDefault(key, 0) < val) return false;}return true;}
}

串联所有单词的子串

题目:https://leetcode.cn/problems/substring-with-concatenation-of-all-words/description/

题解:https://leetcode.cn/problems/substring-with-concatenation-of-all-words/solutions/3825/chuan-lian-suo-you-dan-ci-de-zi-chuan-by-powcai

// 对words中的所有单词,维护一个单词计数map
// 串联子串中保证了每个子单词的原字符顺序不变
class Solution {public List<Integer> findSubstring(String s, String[] words) {int ls = s.length(), n = words.length;int lw = n * words[0].length(), oneLen = words[0].length();List<Integer> res = new ArrayList<>();if (lw > ls) return res;Map<String, Integer> wordsMap = new HashMap<>();for (int i = 0; i < n; i ++) {wordsMap.put(words[i], wordsMap.getOrDefault(words[i], 0) + 1);}for (int i = 0; i < ls - lw + 1; i ++) {  //  i < ls - lw + 1,保证能枚举到最后一个窗口的第一个下标位置Map<String, Integer> tmpMap = new HashMap<>();for (int j = i; j < i + lw; j += oneLen) {String subStr = s.substring(j, j + oneLen);tmpMap.put(subStr, tmpMap.getOrDefault(subStr, 0) + 1);}if (wordsMap.equals(tmpMap)) res.add(i);}return res; }
}

优化:(常规的滑动窗口思路,和最小覆盖子串的代码逻辑相似)

class Solution {public List<Integer> findSubstring(String s, String[] words) {int ls = s.length(), n = words.length;int lw = n * words[0].length(), oneLen = words[0].length();List<Integer> res = new ArrayList<>();if (lw > ls) return res;Map<String, Integer> wordsMap = new HashMap<>();for (int i = 0; i < n; i ++) {wordsMap.put(words[i], wordsMap.getOrDefault(words[i], 0) + 1);}for (int i = 0; i < oneLen; i ++) {  // 保证枚举到所有单词[0...oneLen], [1...oneLen + 1], ...int st = i, ed = i, cnt = 0;Map<String, Integer> tmpMap = new HashMap<>();while (ed < ls - oneLen + 1) {  // 同解法一的判断String subStr = s.substring(ed, ed + oneLen);tmpMap.put(subStr, tmpMap.getOrDefault(subStr, 0) + 1);ed += oneLen;cnt ++;  // 当前窗口里有几个单词while(tmpMap.getOrDefault(subStr, 0) > wordsMap.getOrDefault(subStr, 0)) {// 窗口里的单词并不在wordsMap里,移动窗口// 或者,窗口里当前单词重复出现了,移动窗口String stStr = s.substring(st, st + oneLen);  // 窗口里最左边的单词tmpMap.put(stStr, tmpMap.getOrDefault(stStr, 0) - 1);st += oneLen;cnt --;}if (cnt == n) res.add(st);}}return res;}
}

再优化(直接跳过不在words里的单词和窗口):

class Solution {public List<Integer> findSubstring(String s, String[] words) {int ls = s.length(), n = words.length;int lw = n * words[0].length(), oneLen = words[0].length();List<Integer> res = new ArrayList<>();if (lw > ls) return res;Map<String, Integer> wordsMap = new HashMap<>();for (int i = 0; i < n; i ++) {wordsMap.put(words[i], wordsMap.getOrDefault(words[i], 0) + 1);}for (int i = 0; i < oneLen; i ++) {  // 保证枚举到所有单词[0...oneLen], [1...oneLen + 1], ...int st = i, ed = i, cnt = 0;Map<String, Integer> tmpMap = new HashMap<>();while (ed < ls - oneLen + 1) {  // 同解法一的判断String subStr = s.substring(ed, ed + oneLen);ed += oneLen;if (!wordsMap.containsKey(subStr)) {/**当前窗口的当前单词不是words里的单词,肯定不符合题意,更新窗口。题中要求所有串联单词必须挨在一起,这个判断过滤掉不挨在一起的窗口*/cnt = 0;st = ed;tmpMap.clear();continue;}tmpMap.put(subStr, tmpMap.getOrDefault(subStr, 0) + 1);cnt ++;  // 当前窗口里有几个单词while(tmpMap.getOrDefault(subStr, 0) > wordsMap.getOrDefault(subStr, 0)) {// 窗口里的单词并不在wordsMap里,移动窗口// 或者,窗口里当前单词重复出现了,移动窗口String stStr = s.substring(st, st + oneLen);  // 窗口里最左边的单词tmpMap.put(stStr, tmpMap.getOrDefault(stStr, 0) - 1);st += oneLen;cnt --;}if (cnt == n) res.add(st);}}return res;}
}

长度最小的子数组

题目:https://leetcode.cn/problems/minimum-size-subarray-sum/description/

class Solution {public int minSubArrayLen(int target, int[] nums) {int n = nums.length;int milen = Integer.MAX_VALUE, st = 0, ed = 0, sum = 0;boolean isNull = false;while (ed < n) {sum += nums[ed];while (sum >= target) {isNull = true;if (milen > ed - st + 1) {milen = ed - st + 1;}sum -= nums[st];st ++;}ed ++;}if (!isNull) return 0;return milen;}
}

滑动窗口最大值

题目:https://leetcode.cn/problems/sliding-window-maximum/description/

题解:https://leetcode.cn/problems/sliding-window-maximum/solutions/2361228/239-hua-dong-chuang-kou-zui-da-zhi-dan-d-u6h0

class Solution {public int[] maxSlidingWindow(int[] nums, int k) {// 借鉴最小栈的思路,再O(1)时间内找出窗口内的最大值// 双向队列维持一个窗口内的非严格递减排序// 队头是窗口内的最大值int n = nums.length;if (k == 1) return nums;int[] res = new int[n - k + 1];Deque<Integer> dq = new LinkedList<>();int idx = 0;for (int i = 0; i < k; i ++) {while (!dq.isEmpty() && dq.peekLast() < nums[i]) {dq.removeLast();}dq.addLast(nums[i]);}res[idx ++] = dq.peekFirst();for (int i = k; i < n; i ++) {if (dq.peekFirst() == nums[i - k]) dq.removeFirst();while (!dq.isEmpty() && dq.peekLast() < nums[i]) {dq.removeLast();}dq.addLast(nums[i]);res[idx ++] = dq.peekFirst();}return res;}
}

字符串的排列

题目:https://leetcode.cn/problems/permutation-in-string/description/

题解-方法二:https://leetcode.cn/problems/smallest-range-covering-elements-from-k-lists/solutions/355881/zui-xiao-qu-jian-by-leetcode-solution

class Solution {public boolean checkInclusion(String s1, String s2) {int ls1 = s1.length(), ls2 = s2.length();if (ls1 > ls2) return false;int[] cnt1 = new int[26], cnt2 = new int[26];for (int i = 0; i < ls1; i ++) {cnt1[s1.charAt(i) - 'a'] ++;cnt2[s2.charAt(i) - 'a'] ++;}if (Arrays.equals(cnt1, cnt2)) return true;for (int i = ls1; i < ls2; i ++) {cnt2[s2.charAt(i - ls1) - 'a'] --;cnt2[s2.charAt(i) - 'a'] ++;if (Arrays.equals(cnt1, cnt2)) return true;}return false;}
}

最小区间

题目:https://leetcode.cn/problems/smallest-range-covering-elements-from-k-lists/description/

class Solution {public int[] smallestRange(List<List<Integer>> nums) {int n = nums.size();Map<Integer, List<Integer>> index = new HashMap<>();int mi = Integer.MAX_VALUE, mx = Integer.MIN_VALUE;for (int i = 0; i < n; i ++) {for (int item : nums.get(i)) {List<Integer> tmp = index.getOrDefault(item, new ArrayList<Integer>());tmp.add(i);index.put(item, tmp);if (mi > item) mi = item;if (mx < item) mx = item;}}int st = mi, ed = mi - 1, ansSt = 0, ansEd = Integer.MAX_VALUE, cnt = 0;// System.out.println(mi + ", " + mx);int[] interval = new int[n];   // 记录滑动窗口覆盖了多少区间,下标标识某个区间while (ed < mx) {ed ++;if (index.containsKey(ed)) {for (int idx : index.get(ed)) {  // 枚举被覆盖的区间interval[idx] ++;if (interval[idx] == 1) {  // idx标识的区间第一次被覆盖时,标记该区间被覆盖cnt ++;}while (cnt == n) {  // 当所有区间被覆盖,更新最小区间和窗口if (ed - st < ansEd - ansSt) {// System.out.println("*--*-*-");ansSt = st;ansEd = ed;}if (index.containsKey(st)) {  // 更新最小区间的左端点,看是否能覆盖全部区间for (int leftIdx : index.get(st)) {interval[leftIdx] --;if (interval[leftIdx] == 0) {cnt --;}}}st ++;}}}}return new int[] {ansSt, ansEd};}
}

相关文章:

刷题笔记 - 滑动窗口

文章目录 滑动窗口最长无重复子串最小覆盖子串串联所有单词的子串长度最小的子数组滑动窗口最大值字符串的排列最小区间 滑动窗口 所有题目来自leetcode的回答&#xff1a;https://leetcode.cn/problems/longest-substring-without-repeating-characters/solutions/3982/hua-d…...

Docker搭建LNMP+Wordpress的实验

目录 一、项目的介绍 1、项目需求 2、服务器环境 3、任务需求 二、Linux系统基础镜像 三、部署Nginx 1、建立工作目录 2、编写Dockerfile 3、准备nginx.conf配置文件 4、设置自定义网段和创建镜像和容器 5、启动镜像容器 6、验证nginx 三、Mysql 1、建立工作目录…...

使用Python Pandas实现两表对应列相加(即使表头不同)

目录 引言 Pandas库简介 实现对应列相加 步骤一&#xff1a;加载数据 步骤二&#xff1a;重命名列 步骤三&#xff1a;对应列相加 步骤四&#xff1a;保存结果 案例分析 结论 引言 在数据分析和处理的日常工作中&#xff0c;我们经常会遇到需要将来自不同数据源的数据…...

Linux 虚拟主机切换php版本及参数

我使用的Hostease的Linux虚拟主机产品,由于网站程序需要支持高版本的PHP,程序已经上传到主机&#xff0c;但是没有找到切换PHP以及查看PHP有哪些版本的位置&#xff0c;因此咨询了Hostease的技术支持&#xff0c;寻求帮助了解到可以实现在cPanel面板上找到此切换PHP版本的按钮&…...

Content-Type详解

...

GaussDB数据库SQL系列-复合查询

目录 一、前言 二、复合查询基础 三、实际应用示例 1、使用UNION合并查询结果 2、使用INTERSECT找出共同元素 3、使用EXCEPT排除特定结果 四、高级技巧 1、子查询实例 2、JOIN的应用 五、总结 一、前言 GaussDB是华为自主创新研发的分布式关系型数据库&#xff0c;具…...

【Unity】修改模型透明度

在 Unity 中修改模型透明度主要有两种方法&#xff1a;通过材质和通过着色器。以下是两种方法的步骤和解释&#xff1a; 方法 1&#xff1a;通过材质 在 Unity 编辑器中&#xff0c;选择你想要修改透明度的模型。在 Inspector 窗口中&#xff0c;找到模型的 Renderer 组件&am…...

第五篇:通信脉络:探索计算机外设与总线体系的精髓

通信脉络&#xff1a;探索计算机外设与总线体系的精髓 1 引言 在这个技术日新月异的时代&#xff0c;理解计算机系统的基本构成要素 —— 总线和外设 —— 对于每个从事技术工作的人来说都是至关重要的。这些组件不仅是计算机通信的基石&#xff0c;也直接影响着系统的性能、效…...

24.5.5(离散化+树状数组,线段树)

星期一&#xff1a; dp题单 背包 第四题 混可乐 cf传送门 思路&#xff1a;条件可演化为每种可乐值为 ai-n&#xff0c;选最少的可乐使总和为0&#xff08;具体可看官方题解 到这会发现背包并不适合了&#xff0c;其实这是道bfs伪装的背包…...

C语言 | Leetcode C语言题解之第69题x的平方根

题目&#xff1a; 题解&#xff1a; int mySqrt(int x) {long int i 0;for(i0;;i){long int a i*i;long int b (i1)*(i1);if(a < x&&b > x){break;}}return i; }...

静态分配IP,解决本地连接不上Linux虚拟机的问题

在Window环境下&#xff0c;使用远程终端工具连接不了VMware搭建的Linux虚拟机&#xff08;CentOS 7&#xff09;&#xff0c;并且在命令行ping不通该Linux虚拟机的IP地址。下面通过配置网关解决本地与Linux虚拟机连接问题&#xff1a; 1 查看虚拟机网关地址 在VMware虚拟机上…...

每日JAVA高级面试题

Java 高级面试问题及答案 以下是几个Java高级面试中可能会问到的问题&#xff0c;包括问题、答案以及一些探讨过程。 问题1: 请解释Java中的多线程以及线程池的使用场景和优势 答案&#xff1a; Java中的多线程允许程序执行多个任务&#xff0c;从而提高应用程序的响应速度和…...

修改JupyterNotebook文件存储位置

Jupyter Notebook 1、通过AnaConda安装Jupyter Notebok 2、在开始菜单里找到并打开Anaconda Prompt&#xff0c;输入如下命令&#xff0c;然后执行。 jupyter notebook --generate-config4、打开以下文件 找到 C:/Userzh/.../.jupyter 打开 jupyter_notebook_config.py 取消…...

python Flask路由系统如何影响应用性能的一些关键点

Flask的路由系统对应用性能的影响主要体现在路由匹配和分发请求的效率上。以下是关于Flask路由系统如何影响应用性能的一些关键点&#xff1a; 路由匹配方式&#xff1a;Flask支持精准匹配和模糊匹配两种方式。精准匹配是指URL中的路径和定义的路由规则完全匹配&#xff0c;而…...

nodejs的ws+vue3编写聊天室的demo

nodejs编写ws服务是非常简单高效的&#xff0c;nodejs有众多的实现ws的库&#xff0c;如ws,SocketIO等&#xff0c;nodejs的事件线程是单线程的&#xff0c;所以不要在事件线程内做阻塞性的操作&#xff0c;耗时的操作交给工作线程或者子进程操作。 我使用nodejsvue3实现了写了…...

《MySQL数据类型》

文章目录 一、理解数据本身就是一种约束1.tinyint类型和 tinyint unsigned类型2.其他的int类型 二、bit类型三、float类型1.signed版本注意2.unsigned版本 四、decimal类型float 和 decimal 总结五、char类型&#xff08;固定长度&#xff09;六、varchar类型&#xff08;可变长…...

解决windows中的WSL Ubuntu子系统忘记root密码和用户密码问题

1、以管理员身份运行PowerShell 2、在powershell中执行wsl.exe --user root wsl.exe --user root如果出现了上面的报错&#xff0c;则需要运行步骤3、4&#xff0c;然后在执行步骤5改密码&#xff0c;如果没有出错&#xff0c;请直接跳到第5步改密码操作&#xff01;&#xff…...

数据分析——业务指标分析

业务指标分析 前言一、业务指标分析的定义二、业务问题构建问题构建的要求 三、业务问题的识别在识别问题的阶段对于企业内部收益者的补充 四、竞争者分析竞争者分析的内容竞争者分析目的案例 五、市场机会识别好的市场机会必须满足的条件市场机会案例 六、风险控制数据分析师常…...

给c++小白的教程9:循环

老师给比纳瑞出了一道题。 给出 &#x1d45b; 和 &#x1d45b; 个整数 &#x1d44e;&#x1d456;&#xff0c;求这 &#x1d45b; 个整数中最小值是什么。 由题意得&#xff0c;此题无论是顺序结构或是选择结构都连输入也解决不了。 这时候&#xff0c;我们就要用上循环…...

SLAIM:一个实时的RGB-D NeRF-SLAM系统

SLAIM&#xff1a;一个实时的RGB-D NeRF-SLAM系统与现有的NeRF-SLAM系统相比&#xff0c;我们的方法在跟踪性能上始终表现出更强的竞争力。我们的方法采用体积密度表示&#xff0c;并引入了一种新的KL正则化器在射线终止分布上&#xff0c;将场景几何限制为空隙空间和不透明表面…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

C++:多态机制详解

目录 一. 多态的概念 1.静态多态&#xff08;编译时多态&#xff09; 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1&#xff09;.协变 2&#xff09;.析构函数的重写 5.override 和 final关键字 1&#…...

day36-多路IO复用

一、基本概念 &#xff08;服务器多客户端模型&#xff09; 定义&#xff1a;单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用&#xff1a;应用程序通常需要处理来自多条事件流中的事件&#xff0c;比如我现在用的电脑&#xff0c;需要同时处理键盘鼠标…...