【LeetCode刷题】滑动窗口思想解决问题:长度最小的子数组、无重复字符的最长子串

【LeetCode刷题】Day 7

  • 题目1:209.长度最小的子数组
    • 思路分析:
    • 思路1:暴力枚举 O(N^2^)
    • 思路2:滑动窗口 O(N)
  • 题目2:3. 无重复字符的最长子串
    • 题目分析:
    • 思想1:暴力枚举+哈希表O(N^2^)
    • 思想2:滑动窗口思想+哈希表O(N)
  • 收获满满✨:

在这里插入图片描述

题目1:209.长度最小的子数组

在这里插入图片描述

思路分析:

思路1:暴力枚举 O(N2)

思路2:滑动窗口 O(N)

在这里插入图片描述

滑动窗口整体思路:
  1. 初始化左右指针;
  1. 进窗口:循环条件、维护信息
  1. 判断:判断是否达到条件,从而决定是否出窗口。
  1. 更新结果:这一点是就题论题,需要判断在哪里更新结果位置。
本题的具体体现:
  1. 初始化左右指针:int left = 0 , right = 0;
  1. 进窗口:条件:sum += nums[right]; 维护的信息:子数组的和sum;
  1. 判断:当前子数组是否满足题干要求(sum >= target),满足记录长度;
  1. 更新结果:对于这道题而言,我们需要的是最小长度,因此一次条件成立并不能满足,需要比对后,更新结果。判断条件为成立条件,则需要在条件循环内部更新。

通俗的来讲思路的话:从left开始寻找满足题意的该位置长度最小的子数组,满足题意就到下一个位置,继续找该位置长度最小的子数组。

注意:感觉和暴力有些像,但这里我们的右端点是不需要更新到和left相同的,因为有上一个数的基础,知道上一个子数组是刚好多了右边一位才满足题意的,我们left到第二位置后,是要检查少去第一位,是否还满足,不满足就更新右端点。找到当前位置的长度最小的子数组。满足,就代表这就是当前位置最小长度的子数组,就left更新。

代码实现:

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        // 滑动窗口
        int n = nums.size();
        int len = 0, sum = 0;
        int left=0,right=0;
        while(right<n) 
        {
            sum += nums[right];
            while (sum >= target) 
            {
                if(len==0) 
                    len=right+left+1;
                else if (right - left + 1 < len)
                    len = right - left + 1;
                sum -= nums[left];
                left++;
            }
            right++;
        }
        return len;
    }
};

LeetCode链接:209.长度最小的子数组


题目2:3. 无重复字符的最长子串

在这里插入图片描述

题目分析:

就是寻找给定字符串的子串,要求子串内部没有重复出现,题干很简单。
提示中有说明:s由英文字母、数字、符号和空格组成---->简单哈希表判断重复

思想1:暴力枚举+哈希表O(N2)

找每个位置的无重复字符的最大子串,left不变,right去找,并通过hash表判断是否符合条件,不符合条件就结束这次循环,left到下一个位置,right更新到和left相同位置,继续重复上述操作。

思想2:滑动窗口思想+哈希表O(N)

在这里插入图片描述

Why?为什么使用滑动窗口思想,其实就是对暴力查找的优化,暴力查找有两个缺点:
  1. left是一个位置一个位置更新的,但在实际中比如图中例子:deabcabca ,我们在第一个位置找到的最长无重复的子串是deabc,后面是因为a重复了才结束的,我们只是left到下一个位置,其实重复位置还是一样的,仍然是a,此时的长度一定是小于上一结果的长度。我们不妨直接把left移动到第一个a后面。
  1. right每次循环都需要更新为left才开始,这也是很低效的,依旧是上面的例子:第一次循环后,left直接更新到第一个a的后面,此时开始的子串为:bc,这不就是上一次循环满足条件子串的子串吗?怎么会不符合条件呢?所以不妨right就从这个位置开始寻找。
本题的具体体现:
  1. 初始化左右指针:int left = 0 , right = 0;
  1. 进窗口:hash[s[right]]++; 维护的信息:哈希表hash;
  1. 判断:当前子串不满足条件(hash[s[right]]<=1),就进入循环,完成出哈希表 hash[s[left++]]--:更新left位置到重复字符后面,这里就是更新left位置。 更新结果len=max(len,right-left+1);;
  1. 更新结果:对于这道题,只要满足题目条件,不进循环条件,就是合适的,就可以更新len值

简单哈希表模拟: 128的空间对应ASCII码,出现过的字符,就把该字符对应ASCII码记为1,没出现过记为0,当大于1时,就是重复出现。

代码实现:

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int hash[128]={0};  //使用数组来简单模拟哈希表
        int left=0,right=0,n=s.size();
        int len=0;
        while(right<n)
        {
            hash[s[right]]++;       //进入窗口
            while(hash[s[right]]>1) //判断
                hash[s[left++]]--;  //出窗口
            len=max(len,right-left+1); //更新结果
            right++;
        }
        return len;
    }
};

LeetCode链接:3. 无重复字符的子串

收获满满✨:

  • Why?为什么使用滑动窗口?—> 就是对暴力枚举的优化,得出的要用这种思想;
  • hash表的简单模拟实现get;

好好刷题,好好学习专业知识,但也要好好生活哦🦖~ 天天开心!🎈
在这里插入图片描述


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

鹏特资本进入中国市场具有以下一些优势

1. 带来资金&#xff1a;补充国内资金缺口&#xff0c;为企业发展和项目建设提供重要的资金支持。 2. 先进技术和管理经验&#xff1a;有助于推动技术创新和管理水平提升&#xff0c;促进产业升级和优化。 3. 促进竞争&#xff1a;激发国内市场活力&#xff0c;促使本土企业不…

Spring Cloud 项目中使用 Swagger

Spring Cloud 项目中使用 Swagger 关于方案的选择 在 Spring Cloud 项目中使用 Swagger 有以下 4 种方式&#xff1a; 方式一 &#xff1a;在网关处引入 Swagger &#xff0c;去聚合各个微服务的 Swagger。未来是访问网关的 Swagger 原生界面。 方式二 &#xff1a;在网关处引…

软件设计师笔记2

文章目录 软考知识点总结1. 计算机组成原理网络与信息安全数据结构与算法AOE网 编译原理操作系统软件设计软件测试数据库计算机软件产权其它 软考知识点总结 1. 计算机组成原理 cpu控制器&#xff0c;专门产生指令操作&#xff0c;送到计算机各个部位执行处理 DMA&#xff08…

ISCC2024个人挑战赛WP-WEB

&#xff08;非官方解&#xff0c;以下内容均互联网收集的信息和个人思路&#xff0c;仅供学习参考&#xff09; 还没想好名字的塔防游戏 GET /world.js HTTP/1.1 Host: 101.200.138.180:17345 Accept: text/html,application/xhtmlxml,application/xml;q0.9,image/avif,i…

LeetCode题练习与总结:二叉树的层序遍历Ⅱ--107

一、题目描述 给你二叉树的根节点 root &#xff0c;返回其节点值 自底向上的层序遍历 。 &#xff08;即按从叶子节点所在层到根节点所在的层&#xff0c;逐层从左向右遍历&#xff09; 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[…

嵌入式进阶——LED呼吸灯(PWM)

&#x1f3ac; 秋野酱&#xff1a;《个人主页》 &#x1f525; 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 PWM基础概念STC8H芯片PWMA应用PWM配置详解占空比 PWM基础概念 PWM全称是脉宽调制&#xff08;Pulse Width Modulation&#xff09…

C++笔试强训day33

目录 1.跳台阶扩展问题 2.包含不超过两种字符的最长子串 3.字符串的排列 1.跳台阶扩展问题 链接https://www.nowcoder.com/practice/953b74ca5c4d44bb91f39ac4ddea0fee?tpId230&tqId39750&ru/exam/oj 我是用动态规划解决的&#xff1a; #include <iostream>…

一文读懂:http免费升级https

背景&#xff1a; 随着现在全民网络安全意识的日益提升&#xff0c;各个网站需要实现的https数量也随之提升&#xff0c;那么如何将原本网站的http访问方式升级为https呢&#xff1f; 该内容为如何免费将网站的http访问升级为https访问 论https的加密逻辑&#xff1a; 步骤 …

【数据结构(邓俊辉)学习笔记】图01——图的表示与实现

文章目录 1. 概述1.1 邻接 关联1.2 无向 有向1.3 路径 环路 2. 邻接矩阵2.1 接口2.2 邻接矩阵 关联矩阵2.3 实例2.4 顶点和边2.5 邻接矩阵2.6 顶点静态操作2.7 边操作2.7 顶点动态操作2.8 综合评价 1. 概述 1.1 邻接 关联 相对于此前的线性以及半线性结构&#xff0c;图…

RAG概述(二):Advanced RAG 高级RAG

目录 概述 Advanced RAG Pre-Retrieval预检索 优化索引 增强数据粒度 粗粒度 细粒度 展开说说 优化索引 Chunk策略 Small2Big方法 元数据 引入假设性问题 对齐优化 混合检索 查询优化 查询扩展 查询转换 Post-Retrieval后检索 参考 概述 Native RAG&#…

Python并发编程学习记录

1、初识并发编程 1.1、串行&#xff0c;并行&#xff0c;并发 串行(serial)&#xff1a;一个cpu上按顺序完成多个任务&#xff1b; 并行(parallelism)&#xff1a;任务数小于或等于cup核数&#xff0c;多个任务是同时执行的&#xff1b; 并发(concurrency)&#xff1a;一个…

Linux之Nginx

1、Nginx 1.1、什么是Nginx Nginx最初由Igor Sysoev开发&#xff0c;最早在2004年公开发布。它被设计为一个轻量级、高性能的服务器&#xff0c;能够处理大量并发连接而不消耗过多的系统资源。Nginx的架构采用了事件驱动的方式&#xff0c;能够高效地处理请求。它的模块化设计使…

Redis 的持久化(真的好细)

前言 Redis 是一个内存数据库&#xff0c;把数据存储在内存中&#xff0c;而内存中的数据是不持久的&#xff0c;要想数据持久就得将数据存储到硬盘中&#xff0c;而 Redis 相比于 Mysql 这样的关系型数据库最大的优势就在于将数据存储在内存中从而效率更高&#xff0c;速度更快…

大数据智慧消防解决方案(24页PPT)

方案介绍&#xff1a; 大数据智慧消防解决方案是提升消防安全管理水平、保障人民群众生命财产安全的重要手段。通过集成物联网、云计算、大数据、人工智能等先进技术&#xff0c;构建集监测、预警、指挥、救援于一体的智慧消防系统&#xff0c;将为消防安全事业注入新的活力。…

单日收益1000+看了就会的项目,最新灵异短视频项目,简单好上手可放大操作

各位好友&#xff0c;佳哥在此与大伙儿聊聊一项神秘莫测的短视频项目。你或许会想&#xff0c;“又是一个视频创作项目&#xff1f;” 但别急&#xff0c;这个项目与众不同&#xff0c;日入千元不再是梦&#xff0c;而且它的易用性让人惊喜&#xff0c;无论你是初学者还是资深玩…

数据结构·一篇搞定队列!

hello&#xff0c;大家好啊&#xff0c;肖恩又拖更了&#xff0c;你们听我狡辩&#xff0c;前段时间有期中考试&#xff0c;so我就没什么时间写这个&#xff0c;在这给大家道个歉&#x1f62d;&#x1f62d;&#x1f62d; 我后面一定尽力不拖更 那么接下来&#xff0c;我们来看…

数字化转型必备:营销策划流程图,打造你的数字市场地图

制作营销策划流程图是一个系统化的过程&#xff0c;它可以帮助你清晰地规划和展示营销活动的各个阶段。 以下是制作营销策划流程图的步骤&#xff1a; 1.确定营销目标&#xff1a; 明确你的营销活动旨在实现的具体目标&#xff0c;比如提升品牌知名度、增加销售额、吸引新客…

【CCIE | 网络模拟器】部署 EVE-NG

目录 1. 环境准备2. 下载 EVE-NG 镜像3. 安装 EVE-NG 虚拟机3.1 创建 eve-ng 虚拟机3.2 选择存储3.3 定义虚拟机计算资源&#xff08;1&#xff09;开启CPU虚拟化功能&#xff08;2&#xff09;精简置备磁盘 3.4 检查虚拟机设置 4. 安装系统4.1 选择系统语言4.2 选择系统键盘类…

2024.05.25 第 131 场双周赛

Leetcode 第 131 场双周赛 求出出现两次数字的 XOR 值 [Leetcode 求出出现两次数字的 XOR 值](https://leetcode.cn/problems/find-the-xor-of-numbers-which-appear-twice/description/] 给你一个数组 nums &#xff0c;数组中的数字 要么 出现一次&#xff0c;要么 出现两次…

自从有了可观测性,传统运维如何进行提升?

在 201x 年&#xff0c;随着容器技术的出现&#xff0c;容器的部署方式逐渐被各大互联网公司采用&#xff0c;相比物理机/虚拟机&#xff0c;容器的好处是环境隔离、轻量、快速。 但是管理容器是一件复杂的事情&#xff0c;后来出现了 Kubernetes&#xff0c;成为了事实上的容…