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

[滑动窗口] (一) LeetCode 209. 长度最小的子数组 和 LCR 016.无重复字符的最长子串

[滑动窗口] (一) LeetCode 209. 长度最小的子数组 和 LCR 016.无重复字符的最长子串

文章目录

      • [滑动窗口] (一) LeetCode 209. 长度最小的子数组 和 LCR 016.无重复字符的最长子串
        • 什么是滑动窗口
        • 长度最小的子数组
          • 题目解析
          • 解题思路
          • 代码实现
          • 总结
        • 无重复字符的最长子串
          • 题目解析
          • 解题思路
          • 代码实现
          • 总结

什么是滑动窗口

滑动窗口并不是真的创建出一个数组,而是利用一个left“指针”和right“指针”,让它们在原数组之间的区间来模拟出一个类似窗口的"数组",一般由right向右移动扩大窗口大小,直到不满足要求后,再让left向右移动。

这就是模拟出一个滑动窗口。

长度最小的子数组

209. 长度最小的子数组

image-20231103153110188

题目解析

(1) 含有正整数的nums和一个正整数target

(2) 找出一个连续子数组的总和大于等于target

解题思路

通过题目解析,我们确定了这道题的解法。

解法:滑动窗口

构建一个left指针, 一个right指针。让他们之间的区间模拟,我们想要的小于target的一一个连续子数组。

由right来进窗口,left负责出窗口。在每次出窗口前更新结果。

示例1:

image-20231103155032444

看到这里,大家可以先去实现代码,再看下面的内容。


代码实现
class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int sum = 0, ret = INT_MAX;for(int left = 0, right = 0; right < nums.size(); right++){//进窗口sum += nums[right];//判断while(sum >= target){//更新结果ret = min(ret, right - left + 1);//出窗口sum -= nums[left++];}}return ret == INT_MAX ? 0 : ret;}
};

image-20231103155238475

总结

细节1:ret赋值为INT_MAX,方便最后两数取小。

细节2:返回时判断,ret是否为INT_MAX,否则返回0

无重复字符的最长子串

LCR 016. 无重复字符的最长子串

image-20231103155316305

题目解析

(1) 从字符串中找出一个子字符串

(2) 子字符串的要求:最长且不能有字母重复

解题思路

从题目分析得出,我们这道题可以使用滑动窗口+哈希的方法

解法:滑动窗口+哈希

定义一个left,right指针,right负责进窗口,left负责出窗口,哈希表进行判断子串是否重复。

当重复时,left不断出窗口直到hash[s[right]]不大于1。在每次不重复时更新结果。

示例1:

image-20231103162450797

看到这里,大家可以先去实现代码,再看下面的内容。


代码实现
class Solution {
public:int lengthOfLongestSubstring(string s) {if(s.size() == 0) return 0;int ret = 0;int hash[128] = {0};for(int left = 0, right = 0; right < s.size(); right++){//进窗口hash[s[right]]++;//判断while(hash[s[right]] > 1){//出窗口hash[s[left++]]--;}//更新结果ret = max(ret, right - left + 1);}return ret;}
};

image-20231103162533694

总结

细节1:每次进入一个字符就需要更新一次结果。

细节2:字符串为空时,返回0。

相关文章:

  • 安全架构设计理念与实践
  • Azure 机器学习 - 使用无代码 AutoML 训练分类模型
  • 基于单片机的温室环境数据监测系统的设计
  • Spring - Spring底层核心原理解析
  • 速学数据结构 | 循环队列怎么写才最高效?只需要掌握这些技巧
  • WiFi模块在智能家居中的应用与优化
  • 在虚拟机centos7中部署docker+jenkins最新稳定版
  • STM32H723串口接收丢数据
  • 你渲染的3ds Max效果图为什么这么假?原来问题出在这!
  • Activiti7工作原理
  • NodeJS 安装及环境配置
  • 【行云流水线实践】基于“OneBuild”方法对镜像进行快速装箱 | 京东云技术团队
  • Android开发笔记(三)—Activity篇
  • 0-1背包 完全背包 + 至多/恰好/至少 + 空间优化 + 常见变形题
  • Docker 运行swagger-editor实现在线接口文档维护与调试
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • Apache Pulsar 2.1 重磅发布
  • CSS 提示工具(Tooltip)
  • C语言笔记(第一章:C语言编程)
  • Date型的使用
  • ES6语法详解(一)
  • in typeof instanceof ===这些运算符有什么作用
  • Java Agent 学习笔记
  • Mithril.js 入门介绍
  • Mybatis初体验
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • win10下安装mysql5.7
  • 阿里云Kubernetes容器服务上体验Knative
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 当SetTimeout遇到了字符串
  • 规范化安全开发 KOA 手脚架
  • 经典排序算法及其 Java 实现
  • 前端面试之闭包
  • 事件委托的小应用
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 通过几道题目学习二叉搜索树
  • 为视图添加丝滑的水波纹
  • 小程序01:wepy框架整合iview webapp UI
  • 函数计算新功能-----支持C#函数
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #QT(智能家居界面-界面切换)
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (二)JAVA使用POI操作excel
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (转) Face-Resources
  • (转)h264中avc和flv数据的解析
  • *1 计算机基础和操作系统基础及几大协议
  • .bat文件调用java类的main方法
  • .NET CF命令行调试器MDbg入门(一)
  • .net core 依赖注入的基本用发
  • .net 流——流的类型体系简单介绍
  • .NET/C# 将一个命令行参数字符串转换为命令行参数数组 args