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

news2024/12/23 18:40:15

【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;

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


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

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

相关文章

时间(空间)复杂度(结构篇)

目录 前言&#xff1a; 一、时间复杂度 1.1 时间复杂度的定义 1.2 时间复杂度的分析 表示方法&#xff1a; 1.3 常见的时间复杂度 1.4 时间复杂度的计算以及简单的分析 冒泡排序 折半查找&#xff08;二分查找&#xff09; 斐波那契数列&#xff08;递归&#xff09…

Android卡顿丢帧低内存与adb shell内存状态

Android卡顿丢帧低内存与adb shell内存状态 卡顿丢帧除了CPU/GPU层面&#xff0c;另外&#xff0c;也需要特别注意整机低内存情况。kswapd0 是一个内核工作线程&#xff0c;内存不足时会被唤醒&#xff0c;做内存回收工作。 当内存频繁在低水位的时候&#xff0c;kswapd0 会被频…

人类最友好语言? YAML 深入解析:从语法到最佳实践

什么是YAML YAML&#xff08;YAML Ain’t Markup Language&#xff09;是一种人类可读的数据序列化语言。它的设计目标是使数据在不同编程语言之间交换和共享变得简单。YAML采用了一种简洁、直观的语法&#xff0c;以易于阅读和编写的方式表示数据结构。 YAML广泛应用于配置文…

C语言题目-添加逗号(详解)

前言 今天来看看如何使用C语言对一串数字添加逗号吧&#xff0c;在我们电子账户上的余额都是每3位数有一个逗号吧&#xff0c;今天让我们来使用C语言实现这个功能。 题目描述 对于一个较大的整数 N(1<N<2,000,000,000) 比如 980364535&#xff0c;我们常常需要一位一位数…

8、Qt—Log4Qt使用小记2(每日产生文件)

前言&#xff1a; 开发平台&#xff1a;Win10 64位 开发环境&#xff1a;Qt Creator 13.0.0 构建环境&#xff1a;Qt 5.15.2 MSVC2019 64位 例如&#xff1a;上一篇文章中笔者记录了Log4qt的编译及配置使用&#xff0c;这篇文章重点写下每天产生文件到指定文件夹中&#xff0c;…

软考高级架构师:数据库案例篇 - ER 图和数据流图

一、讲解 从数据流图&#xff08;DFD&#xff09;转换为实体关系图&#xff08;ER图&#xff09;是一个重要的步骤&#xff0c;可以帮助将系统的动态流程转换为静态的数据模型。以下是一些经验和步骤&#xff0c;帮助你完成这一过程&#xff1a; 1. 理解数据流图 识别进程&a…

【操作系统】基本概念 解析+思维导图(特征、概念、功能)并发 共享 虚拟 异步

1.操作系统基本概念 思维导图 1.1 概念和功能 概念 操作系统&#xff08;Operating System&#xff0c;OS&#xff09; 1.操作系统是系统资源的管理者&#xff1a; ​ 操作系统是指控制和管理整个计算机系统的硬件和软件资源&#xff0c;并合理组织调度计算机的工作和资源分…

跟TED演讲学英文:How to escape education‘s death valley by Sir Ken Robinson

How to escape education’s death valley Link: https://www.ted.com/talks/sir_ken_robinson_how_to_escape_education_s_death_valley Speaker: Sir Ken Robinson Date: April 2013 文章目录 How to escape educations death valleyIntroductionVocabularySummaryTranscri…

redis6.2.7安装

1、下载上传到服务器 从官下载redis&#xff0c;地址 https://redis.io/download/#redis-downloads 然后上传到服务器目录 app/apps目录下 2、安装gcc编译器 使用gcc --version命令测试是否已经安装了gcc编译环境&#xff0c;如果没有安装执行以下命令安装 yum install -y …

2024系统架构师软考考题考点回忆版

2024系统架构师软考试题/考点梳理 选择题 (75道单选题) 软件测试(P205) 静态测试:是被测程序不运行,只依靠分析和检查源程序的语句、结构、过程来检查程序是否有错误。动态测试:运行被测试程序,对得到的结果与预期的结果进行比较分析,同时分析运行效率和健壮性能等。…

人力资源新趋势:RPO项目为何成为企业招聘首选?

随着市场竞争的加剧和人才需求的日益复杂化&#xff0c;企业对于高效、精准的招聘需求越来越迫切。在这样的背景下&#xff0c;人力RPO(招聘流程外包)项目应运而生&#xff0c;其独特的优势为企业带来了全新的招聘体验和效果。 首先&#xff0c;人力RPO项目能够显著降低企业的招…

python-情报加密副本

【问题描述】某情报机构采用公用电话传递数据&#xff0c;数据是5位的整数&#xff0c;在传递过程中是加密的。加密规则如下&#xff1a;每位数字都加上8,然后用和除以7的余数代替该数字&#xff0c;再将第1位和第5位交换&#xff0c;第2位和第4位交换。请编写程序&#xff0c;…

MySQL数据处理增删改

数据处理增删改DML 由于约束&#xff0c;以下操作都有可能执行失败&#xff08;后面讲约束&#xff09; 插入数据 INSERT 基础添加&#xff1a;VALUES 值的顺序必须和表中字段顺序相同 INSERT INTO class VALUES(1,王小,10); 向指定字段添加&#xff1a; 值的顺序和指定…

【QGIS入门实战精品教程】10.7: 基于DEM的地形因子分析(坡度、坡向、粗糙度、山体阴影、耐用指数)

文章目录 一、加载dem二、山体阴影三、坡度四、坡向五、地形耐用指数六、地形位置指数七、地表粗糙度一、加载dem 二、山体阴影 方法一:符号系统 利用符号系统中的山体阴影,渲染出阴影效果。 方法二:山体阴影工具 该算法计算输入中的数字化地形模型的山体阴影。根据太阳的位…

C++第十九弹---string模拟实现(下)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1、修改操作 2、迭代器操作 3、字符串操作 4、非成员函数重载操作 总结 1、修改操作 1、string& operator (const char* s); //尾部插入…

科林Linux6_网络

#include<sys/socket.h> #include<arpa/inet.h> //大小端转换 #include<netdb.h> //DNS一、Socket套接字 为了开发网络应用&#xff0c;系统提供一套API函数接口&#xff0c;用于网络应用开发&#xff0c;这些接口称为套接字函数 struct sockaddr_in…

【STM32】计算定时器的溢出

TIM2、3、4、5、12、13、14在APB1上&#xff0c;最大计数频率84M。 TIM1、8、9、10、11在APB2上&#xff0c;最大计数频率168M。 time(arr1)/(prescale1)/Tclk 算出来的是秒 下图使用TIM14 84MHz 那么time33600*25000/8400000010S&#xff0c;10S进入一次中断 中断方式开…

【脚本篇】---spyglass lint脚本

目录结构 sg_lint.tcl &#xff08;顶层&#xff09; #1.source env #date set WORK_HOME . set REPORT_PATH ${WORK_HOME}/reports puts [clock format [clock second] -format "%Y-%m-%d %H:%M:%S"] #2.generate source filelist #3.set top module puts "##…

BFS 解决最短路问题

目录 一、前言 1.1 如何使用 BFS 找到最短路&#xff1a; 1.2 为什么不用 dfs &#xff1a; 二、模板套路 三、例题练习 3.1 例题1&#xff1a;迷宫中离入口最近的出口 3.2 例题2&#xff1a;最小基因变化 3.3 例题3&#xff1a;单词接龙 3.4 例题4&#xff1a;为高尔…

Springboot+Vue+ElementUI开发前后端分离的员工管理系统01--系统介绍

项目介绍 springboot_vue_emp是一个基于SpringbootVueElementUI实现的前后端分离的员工管理系统 功能涵盖&#xff1a; 系统管理&#xff1a;用户管理、角色管理、菜单管理、字典管理、部门管理出勤管理&#xff1a;请假管理、考勤统计、工资发放、工资统计、离职申请、个人资…