面试经典 150 题 -- 滑动窗口 (总结)
面试经典150题链接
面试经典 150 题 - 学习计划 - 力扣(LeetCode)全球极客挚爱的技术成长平台
209 . 长度最小的子数组
思路 :
滑动窗口的思想,取i=j=0,向后遍历j,记录前缀和[l,r]为s,如果s>=target,那么左端点向右移动,直到s<target,维护一个[l,r]的滑动窗口,如此循环;
代码
python
class Solution:def minSubArrayLen(self, target: int, nums: List[int]) -> int:n = len(nums)ans = n+1l=0s=0for r,x in enumerate(nums):s+=xwhile s>=target:ans = min(ans,r-l+1)s-=nums[l]l+=1return ans if ans <= n else 0
c++
class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int n = nums.size();if(n==0) return 0 ;int sum = 0;int l = 0 , r = 0 ; int ans = INT_MAX ;while(r < n){sum += nums[r];while(sum >= target){ans = min(ans , r - l + 1) ;sum -= nums[l++];}r++ ;}return ans == INT_MAX ? 0 : ans ;}
};
3 . 无重复字符的最长子串
思路 :
假设在一个无重复元素的字符串后面加上一个字符,如果出现重复元素,那么一定重复的是新加上的那个字符,那么设置一个hash表来统计次数,然后反复将窗口最前面的元素移出窗口,直到将前面与新加元素相同的元素移出时停止;然后循环更新答案即可;
lc题解地址 :
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
代码 :
Python
class Solution:def lengthOfLongestSubstring(self, s: str) -> int:l = 0cnt = Counter()ans = 0for r , c in enumerate(s):cnt[c]+=1while cnt[c]>=2:cnt[s[l]]-=1l+=1ans = max(ans,r-l+1)return ans
C++
class Solution {
public:int lengthOfLongestSubstring(string s) {unordered_map<char,int> hash;int ans=0;int n = s.size();int l=0;for(int r=0;r<n;r++){hash[s[r]]++;while(hash[s[r]] > 1) --hash[s[l++]];ans = max(ans,r-l+1);}return ans;}
};
java
class Solution {public int lengthOfLongestSubstring(String s) {int ans = 0 ;char[] st = s.toCharArray();boolean[] has = new boolean[128] ; int n = s.length();int i = 0 ;for(int j=0;j<n;j++){char c = st[j];while(has[c])has[st[i++]] = false;has[c] = true;ans = Math.max(ans, j-i+1);}return ans;}
}
30 . 串联所有单词的子串
思路 :
滑动窗口,细节看代码
代码 :
class Solution {
public:vector<int> findSubstring(string &s, vector<string> &words) {// 一个窗口包含s中的前a个单词;// 先删去前 i (i=0∼b−1)个字母后,// 将剩下的字母进行划分,如果末尾有不到 b 个字母也删去。vector<int> ans ;int a = words.size() , b = words[0].size() , n = s.size() ;for(int i=0;i<b&&i+a*b<=n;i++){ // 对应b种划分方法unordered_map<string,int> mp;for(int j=0;j<a;j++){//将s从i开始的a个长度为b的字符串放入哈希表中++mp[s.substr(i+j*b,b)];}for(string& str : words){//将words中a个的字符串放入哈希表中,放入一个,对应的频次-1if(--mp[str]==0){mp.erase(str);}}for(int start=i;start<n-a*b+1;start+=b){// 非第一个窗口if(start!=i){//因为上面已经考虑过start==i的情况了,这里直接跳过string in = s.substr(start+(a-1)*b,b);//划入新的字符串if(++mp[in]==0){//划入滑动窗口,就++mp.erase(in);}string out = s.substr(start-b,b);if(--mp[out]==0){mp.erase(out);}}if(mp.empty()){// 若窗口内单词与单词表中单词出现频次差皆为0,则为解ans.push_back(start);}}}return ans ;}
};
76 . 最小覆盖子串
滑动窗口 :
定义两个长度为 606060(足够存下所有字母种类)的数组 c1 和 c2,用于存储字符频率。其中 c1 用于记录字符串 t 中字符的频率,c2 用于记录当前滑动窗口内字符的频率。
设定好字母与频率数组下标的映射关系:小写字母 a-z 对应下标 0-25,大写字母 A-Z 对应下标 26-51。
使用变量 tot 来记录还需要匹配的字符种类数,当 tot = 0 代表当前滑动窗口对应的子串能够实现对 t 的覆盖,即任意字符满足 c2[i]≥c1[i]c2[i] \geq c1[i]c2[i]≥c1[i]。
使用双指针 j 和 i 表示滑动窗口的左右边界。从前往后遍历字符串 s,在每个位置上更新字符频率数组 c2。若 c2 中字符的频率达到了 c1 中的字符频率,则将 tot 减 1,表示一个字符已经匹配完成。
每当右边界往后移动一步之后,滑动窗口会增加一个字符。此时我们检查左边界能否右移,同时不会使得 tot 变大。即每次右边界右移后,我们检查左边界 c2[j]>c1[j]c2[j] > c1[j]c2[j]>c1[j] 是否满足:
若满足:说明当前左边界指向字符并非必须,当前子串 s[j...i]s[j...i]s[j...i] 必然不是最短子串。我们让左边界 j 进行右移,并重复进行左边界 c2[j]>c1[j]c2[j] > c1[j]c2[j]>c1[j] 的检查,直到窗口不能再收缩
若不满足:说明当前窗口没有任何一个后缀字符串能够实现对 t 的覆盖,我们并不能对窗口实现收缩
每次对窗口移动完成后,我们检查当前 tot 是否为 000(对字符串 t 的覆盖是否完成),若为 000 则尝试用当前窗口对应的字符串 s[j...i]s[j...i]s[j...i] 更新 ans。
class Solution {
public:int get(char x) {return x >= 'A' && x <= 'Z' ? x - 'A' + 26 : x - 'a';}string minWindow(string s, string t) {int n = s.size() , cnt = 0 ;// cnt : 还需要匹配的字符种类数// 规定 a-z : 0-25 , A-Z : 26-51// c1 用于记录字符串 t 中字符的频率,c2 用于记录当前滑动窗口内字符的频率vector<int> c1(60),c2(60);for(char c : t) if(++c1[get(c)]==1) cnt ++ ;string ans = "" ;for(int i=0,j=0;i<n;i++){int idx1 = get(s[i]);//将s[i]加入窗口if(++c2[idx1]==c1[idx1]) cnt --;while(j<i){int idx2 = get(s[j]);// 尝试将s[j]划出窗口if(c2[idx2]>c1[idx2] && --c2[idx2]>=0){// 能够滑出窗口//;j++;}else{break;//不能够滑出窗口}}if(cnt==0 && (ans.empty() || ans.size()>i-j+1)) ans = s.substr(j,i-j+1);}return ans ;}
};
相似题目 :
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
相关文章:
面试经典 150 题 -- 滑动窗口 (总结)
面试经典150题链接 面试经典 150 题 - 学习计划 - 力扣(LeetCode)全球极客挚爱的技术成长平台 209 . 长度最小的子数组 思路 : 滑动窗口的思想,取ij0,向后遍历j,记录前缀和[l,r]为s,如果s>target,那么左端点向右移动,直到s…...
JDK8对List对象根据属性排序
文章目录 JDK8对List对象根据属性排序1. 被排序字段为null或者空时候报错2. 使用Stream流排序2.1 根据name升序2.2 根据name升序,score降序 3. 使用Collections排序3.1 根据name升序3.2 根据name升序,score降序 4. 完整的demo JDK8对List对象根据属性排序…...
【2024美国大学生数学建模竞赛】2024美赛C题网球运动中的势头,网球教练4.0没人比我更懂这个题了!!!
【2023美国大学生数学建模竞赛】2024美赛C题 问题分析、数学模型、实现代码、完整论文 引言 本人是计算机博士,拥有10年网球球龄,2023年的温网决赛,熬夜到半夜全称观看完了直播,对于网球规则、比赛的数据非常熟悉,这个…...
python的Flask生产环境部署说明照做成功
最近刚好在我的Linux服务器上部署一个Web服务, 使用了python的Flask框架, 因此本文主要介绍flask在linux环境上的部署。 Flask 是一个轻量级的 Python Web 框架,非常适合快速开发小型到中型的 Web 应用。然而,Flask 自带的服务器通常是用于开发目的&…...
EXCEL VBA调用百度api识别身份证
EXCEL VBA调用百度api识别身份证 Sub BC_识别身份证()Dim SHD, SHX As WorksheetDim AppKey, SecretKey, Token, PathY As StringDim jSon, JSonA, WithHttp As ObjectDim Pic, oDom, oW, jsCode, paramsDim ARX, BRX, DRX, ERX, ZADDim StrText, StrUrl As StringDim StrA, S…...
【每日一题】7.LeetCode——合并两个有序链表
📚博客主页:爱敲代码的小杨. ✨专栏:《Java SE语法》|《数据结构与算法》 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️ 🙏小杨水平有限,欢…...
【零基础学习CAPL】——CAN报文的发送(按下按钮同时周期性发送)
🙋♂️【零基础学习CAPL】系列💁♂️点击跳转 文章目录 1.概述2.面板创建3.系统变量创建4.CAPL实现4.1.函数展示4.2.全量报文展示5.效果1.概述 本章主要介绍使用CAPL和Panel在按下按钮时发送周期性CAN报文。 本章主要在“【零基础学习CAPL】——CAN报文的发送(配合P…...
六、Nacos源码系列:Nacos健康检查
目录 一、简介 二、健康检查流程 2.1、健康检查 2.2、客户端释放连接事件 2.3、客户端断开连接事件 2.4、小结 2.5、总结图 三、服务剔除 一、简介 Nacos作为注册中心不止提供了服务注册和服务发现的功能,还提供了服务可用性检测的功能,在Nacos…...
2024美赛C题思路/代码:网球中的动量
美赛直播b站,提前关注:川川菜鸟 美赛辅导预定:美赛服务 去年美赛C题:2023美赛C题 题目翻译 背景 在2023年温布尔登男子单打决赛中,20岁的西班牙新星阿尔卡拉兹击败了36岁的诺瓦克德约科维奇。这是德约科维奇自201…...
ConcurrentHashMap原理详解(太细了)
一、什么是ConcurrentHashMap ConcurrentHashMap和HashMap一样,是一个存放键值对的容器。使用hash算法来获取值的地址,因此时间复杂度是O(1)。查询非常快。 同时,ConcurrentHashMap是线程安全的HashMap。专门用于多线程环境。 二、Concurre…...
EasyExcel根据对应的实体类模板完成多个sheet的写入与读取
1.展示模板一的实体类 import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.write.style.ColumnWidth; import com.alibaba.excel.annotation.write.style.ContentRowHeight; import com.alibaba.excel.annotation.write.style.HeadRowH…...
在企业数字化转型过程中,IT运维发挥着怎样的价值?
IT运维软件在企业数字化转型中发挥着重要的价值。从效率、稳定性、安全性和资源利用率以及数据分析决策支持都有巨大的提升。 提高效率 利用自动化巡检功能,实时或定时进行系统巡检,减少人力巡检的繁琐和低效,避免手动操作的失误,…...
01-工厂模式 ( Factory Pattern )
工厂模式 Factory Pattern 摘要实现范例 工厂模式(Factory Pattern)提供了一种创建对象的最佳方式 工厂模式在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象 工厂模式属于创建型模式 摘要 1. 意图 …...
【LeetCode】每日一题 2024_2_2 石子游戏 VI(排序、贪心)
文章目录 LeetCode?启动!!!题目:石子游戏 VI题目描述代码与解题思路 LeetCode?启动!!! 题目:石子游戏 VI 题目链接:1686. 石子游戏 VI 题目描述…...
一站式在线协作开源办公软件ONLYOFFICE,协作更安全更便捷
1、ONLYOFFICE是什么? ONLYOFFICE是一款功能强大的在线协作办公软件,可以创建编辑Word文档、Excel电子表格,PowerPoint(PPT)演示文稿、Forms表单等多种文件。ONLYOFFICE支持多个平台,无论使用的是 Windows、…...
Java进击框架:Spring-综合(十)
Java进击框架:Spring-综合(十) 前言Rest ClientsWebClientRestTemplateHTTP接口 JMS (Java消息服务)使用Spring JMS发送消息接收消息注释驱动的侦听器端点 JMXEmail任务执行和调度Spring TaskExecutor 抽象Spring TaskScheduler 抽象支持调度…...
2024年第九届信号与图像处理国际会议(ICSIP 2024)
2024第九届信号与图像处理国际会议(ICSIP 2024)将于2024年7月12-14日在中国南京召开。ICSIP每年召开一次,在过去的七年中吸引了1200多名与会者,是展示信号和图像处理领域最新进展的领先国际会议之一。本次将汇集来自亚太国家、北美…...
webassembly003 MINISIT mnist/convert-h5-to-ggml.py
数据结构 # Convert MNIS h5 transformer model to ggml format # # Load the (state_dict) saved model using PyTorch # Iterate over all variables and write them to a binary file. # # For each variable, write the following: # - Number of dimensions (int) # …...
fetch和axios的区别
概念不同 Fetch是一种新的获取资源的接口方式,可以直接使用Axios是一个基于XMLHttpRequest封装的工具包,需要引入才可以使用 传递数据的方式不同 Fetch则是需要放在body属性中,以字符串的方式进行传递Axios是放到data属性里,以对象…...
【unity小技巧】FPS简单的射击换挡瞄准动画控制
文章目录 射击动画控制换弹动画瞄准动画完结 射击动画控制 换弹动画 调用 瞄准动画 问题:瞄准时,但是动画会卡住,不会播放瞄准的待机动画 修改 调用 动画如果太快可以去修改播放速度 播放速度变慢了,可能导致切换待机动画也…...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
