leetcode hot100_part4_子串

news2024/9/21 16:36:56

2024/4/20—4/21

560.和为K的子数组

        前缀和+哈希表,做二叉树的时候也有这个套路。注意细节,遍历到当前前缀和的时候是先找结果个数还是先加入哈希?应该先找结果个数,不然的话,当前位置也算上了(因为是前缀和相减,当前位置算的话(当前 - 当前),子数组就不存在了)。注意先放入一个,处理边界,也就是子数组的长度为0(肯定不算)或者当前全长。

        那个枚举的方法,也就是遍历嘛,主要是看懂时间复杂度的解释。

2024/9/10

        关于为什么先统计count,在把当前前缀加入map;可以从下标意义的角度去考虑;遍历到的当前位置的前缀和pre[i],对应的数组[0, i];map中已经存在的前缀数组下标为[0,j]; 重点是j的范围是0~i-1;如果有符合题目条件的子数组,它的下标范围肯定是[j+1,i];

        如果先把当前前缀和放入map,j就可以取到i,结合上面的分析如果此时[0,j] j=i是一个满足条件的pre[i] - k,那么对应的子数组长度为0;不存在,这种情况对应的k=0;

        同理可以明白为什么要先put(0,1);

239.滑动窗口最大值

直接看官方解法了

优先队列

  升序降序,大小顶堆写法

     

9/10

这里再说一下优先队列比较器的两种写法和排序规则

方法一:Javabean类实现Comparable接口指定比较规则

  1. 实现Comparable接口,重写compareTo方法;注意理解,compareTo( ) 方法中的参数是已经存在的元素(就理解为数组中存在的吧),this是新插入的元素,返回值一般都是新的减去旧的,结果大于0,记忆为新的更大,放到后面(旧的右边),所以是升序;
  2. 结果是0的话,下面是是基于TreeSet的,所以不允许重复;优先队列的话看上面,好像是不交换;
public class Student implements Comparable<Student>{
    private String name;
    private int age;

    @Override
    //this:表示当前要添加的元素
    //o:表示已经在(某种数据结构,TreeSet等)存在的元素

    //返回值:
    //负数:表示当前要添加的元素是小的,存左边
    //正数:表示当前要添加的元素是大的,存右边
    //0 :表示当前要添加的元素已经存在,舍弃
    public int compareTo(Student o) {
        //指定排序的规则
        //只看年龄,我想要按照年龄的升序进行排列
        return this.getAge() - o.getAge();
    }
}

 方法二:创建集合对象的时候,传递比较器Comparator指定规则

  1. 和上面的一样,第一个参数是新要插入的元素,第二个参数是已经存在的元素,新的减旧的,按照方法一理解。就是升序,排出来的是个升序数组,优先队列基于堆,拿的第一个元素,是最小的,所以这种方式是小顶堆;
  2. 下面是两种写法

    public static void main(String[] args) {
       /*
            需求:请自行选择比较器排序和自然排序两种方式;
            要求:存入四个字符串, “c”, “ab”, “df”, “qwer”
            按照长度排序,如果一样长则按照首字母排序

            采取第二种排序方式:比较器排序
        */

        //1.创建集合
        //o1:表示当前要添加的元素
        //o2:表示已经在红黑树存在的元素
        //返回值规则跟之前是一样的
        TreeSet<String> ts = new TreeSet<>((o1, o2)->{
                // 按照长度排序
                int i = o1.length() - o2.length();
                //如果一样长则按照首字母排序
                i = i == 0 ? o1.compareTo(o2) : i;
                return i;
        });
    }

思路

        总体的思路,不着急删除(不要想着窗口动一次删一次),因为我们要的是每个窗口的最大值:窗口每移动一次,就把新遍历到的元素加入优先队列,然后取到优先队列的队头元素(队列里所有元素当前的最大值)。

        关键的是,如果这个元素不在当前的滑动窗口范围内,删除,继续取队头元素,直到取到的元素在当前窗口的范围内,再把这个答案放到结果集合里。

 算法竞赛中的常用JAVA API:PriorityQueue(优先队列)_java priorityqueue api-CSDN博客

单调队列

. - 力扣(LeetCode)灵山

        本质上单调是自己代码维护的,所以就是普通队列附加上代码维护的单调性;单调队列和单调栈的处理方式很像;

        关键是维护队头到队尾是降序的特性,并不也无法要求每个元素都在队列中,因为单调的性质总会淘汰一些元素。

  • 为了维护单调特性
    • 初始化前k个时,每个新的元素x被添加到队尾时,都要删除掉所有在x之前且比x大的元素
    • 滑动窗口移动时,添加新元素的时候也执行上述相同的操作
    • 取每个滑动窗口的结果时,队头元素就是max,但是如果它不在滑动窗口的范围内,需要不断删除队头元素,直到队头元素在当前滑动窗口范围内
  • 可以直接在单调队列里存入下标,不用存数字+下标,单调队列是双端队列Deque实现,不是Queue

分块+预处理

        这个方法自己看题解吧,就先不实现了

76.最小覆盖子串

        遍历长串,把所有的字符存到hashmap,key为字符,value为字符出现的位置集合。遍历目标串,拿到目标串每个字符的位置集合。

        对于目标串中的重复元素,

4/29

        看到一个题解说这题很像: 438找到字符串中所有字母异位词

9/10

滑动窗口

本质上就是滑动窗口,只不过是窗口移动时的判断条件变复杂了;

. - 力扣(LeetCode)灵山的题解,搭配视频理解,官方用的hashmap怎么遍历,后面有时间再写吧,这里先用数组;

        滑动窗口就是暴力遍历的上位解法,同向双指针,(就像二分查找是顺序数组暴力查找的上位一样);定义先定义左右指针都指向index = 0;以右指针为基准,随着r++,总会到达满足条件的状态,此时再去l++,区间缩减,左指针向着右指针靠近;直到不满足条件,在这个缩减的过程里更新结果,因为需要的是最小长度的嘛,再去移动右指针;

        再去看官方题解对滑动窗口的描述就很好理解了;

伪代码如下:其实也很好理解的,时间复杂度为O(n);虽然有两个循环

int len...
int l =0;
//for循环中定义r
for(int r = 0; r < len; r++){
    //r每到一个位置需要执行的操作
    状态更新
    
    while(满足条件){
        更新结果;
        状态更新
        移动左指针,l++;
        
    }
}
return 结果 

        接下来就是结合具体的条件了;用数组存储当前遍历到的字符串cur(l,r指针包含的串)和子串t的每个字符的出现次数;

  • 进入for循环,在每次移动r时,更新cur串的字符出现次数
  • while循序的条件是,cur串是否能顾覆盖子串t,字符种类和数量两个方面
    • while中将结果串的左右指针暂时更新为l,r(如果长度更小)
    • 因为要移动左指针,所以要提前更新l++造成的状态影响,最后再l++;这个顺序还是好好思考一下。
  • 优化点:
    • while的条件判断时,需要我们对cur和t进行覆盖的判断,需要遍历记录两个串字符数目的数组(或map),左右指针更新时都需要判断;
    • 要对上述过程进行优化,我们定义一个变量less,对于子串 t 的每种字符cur串中满足的个数,即cur串中是否包含这个字符,以及数量是否足够;
    • less的长度应为 t 的字符种类,数量是否够还是借助之前的数组判断;
  • 优化具体到代码:
    • r++之后,状态更新不仅要更新cur的字符数量,还要更新less,如果更新到的字符,能够包含了 t 中的某个字符,less--;这里有个坑,比较cur和 t 某个字符数量时,要用==判定为满足,因为这个字符在cur中只可能增加了;连续两个相同字符满足条件时,>=的话less会多减()。
    • while的条件为less == 0
    • while里的状态更新时,先假设l++带来的影响(当前 l 对其指向字符数量的变化,这个字,失去这个字符后还能满足覆盖t z中这个字符的条件);再进行l++

 啰嗦了;

最后还有一点思考,之所以可以不断l++到不满足条件,是因为l位置一旦是不满足条件了,后面的l都不会再满足条件

        

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

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

相关文章

【网络安全】-文件上传漏洞

文件操作漏洞包括文件上传漏洞&#xff0c;文件包含漏洞&#xff0c;文件下载漏洞。 文章目录 前言 什么是文件上传漏洞&#xff1f; 文件上传的验证与绕过&#xff1a; 1.前端js验证&#xff1a;   Microsft Edge浏览器&#xff1a; Google Chrome浏览器&#xff1a; 2.后端…

【jvm】记一次hive堆heap内存溢出的排查

先看下java的内存模型 监控jvm工具&#xff1a;visualVM 摘录一下内容&#xff1a; 由c开发的jvm&#xff0c;它巧妙地设计了java的设计理念——即万物皆对象。并设计了这些对象应该如何存储&#xff0c;如何调用&#xff0c;并通过不断迭代设计让对象的存储和回收&#xff0…

最新安装vmware地址(官网找半天没找到)

CDS Repository - /var/www/public/stage/session-120/cds/vmw-desktop 直接走这个点进去&#xff0c;windows点ws&#xff0c;linux和mac点fusion进去下对应版本 win为例子&#xff1a;CDS Repository - /var/www/public/stage/session-50/cds/vmw-desktop/ws/17.6.0/242380…

MyBatis中一对多关系的两种处理方法

目录 1.多表联查&#xff08;通过collection标签的ofType属性&#xff09; 1&#xff09;mapper 2&#xff09;mapper.xml 3&#xff09;测试代码 4&#xff09;测试结果 2.分布查询(通过collection标签的select属性) 1&#xff09;mapper 2&#xff09;mapper.xml 3&#xff0…

铁路输电线路异物检测数据集

铁路输电线路异物检测数据集&#xff0c;共6GB&#xff0c;14000余图像&#xff0c;40000标注&#xff0c;标注鸟巢&#xff0c;塑料袋&#xff0c;气球&#xff0c;漂浮物四大类。coco格式标注。 项目背景&#xff1a; 铁路输电线路是保障铁路运输安全的重要组成部分&#xf…

Golang | Leetcode Golang题解之第405题数字转换为十六进制数

题目&#xff1a; 题解&#xff1a; func toHex(num int) string {if num 0 {return "0"}sb : &strings.Builder{}for i : 7; i > 0; i-- {val : num >> (4 * i) & 0xfif val > 0 || sb.Len() > 0 {var digit byteif val < 10 {digit 0…

小程序组件间通信

文章目录 父传子子传父获取组件实例兄弟通信 父传子 知识点&#xff1a; 父组件如果需要向子组件传递指定属性的数据&#xff0c;在 WXML 中需要使用数据绑定的方式 与普通的 WXML 模板类似&#xff0c;使用数据绑定&#xff0c;这样就可以向子组件的属性传递动态数据。 父…

随机森林算法介绍

文章目录 基本原理关键步骤举例说明算法流程优点缺点实现示例总结 随机森林&#xff08;Random Forest&#xff09;是一种集成学习方法&#xff0c;主要用于分类和回归任务。它通过集成多棵决策树来提高模型的准确性和泛化能力。以下是随机森林的详细算法介绍&#xff1a; 基本…

VMware Tools系列二:图解安装VMware Tools过程

一、安装环境&#xff1a; VMware Workstation Pro17华为OpenEuler虚拟机 二、安装步骤&#xff1a; 在VMware Workstation中为OpenEuler虚拟机安装VMware Tools的步骤如下&#xff1a; 1. 确保OpenEuler虚拟机正在运行。注意&#xff0c;安装的VMware Tools只对当前虚拟机…

结合人工智能,大数据,物联网等主流技术实现业务流程的闭环整合的名厨亮灶开源了

明厨亮灶视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。AI技术可以24小时…

一文学会Containerd配置和镜像加速

一文学会Containerd配置和镜像加速 ❤️ 摘要: 本文介绍了 Containerd 的基本概念及其在 Kubernetes 中的作用&#xff0c;并详细说明了如何通过配置代理、使用国内镜像源或手动下载等方式加速镜像拉取。此外&#xff0c;还提供了针对不同场景的具体配置方法&#xff0c;包括通…

解码 OpenAI 的 o1 系列大型语言模型

OpenAI 表示&#xff0c;其 Strawberry 项目已升级为新的大型语言模型 (LLM) 系列&#xff0c;公司将其命名为 OpenAI o1。 该公司表示&#xff0c;新系列模型还包括一个 o1-mini 版本&#xff0c;以提高成本效益&#xff0c;可根据其推理能力与最新的GPT-4o 模型进行区分。 …

Visual Studio(vs)下载安装C/C++运行环境配置和基本使用注意事项

基本安装 点击跳转到vs官网点击箭头所指的按钮进行下载双击运行刚才下载好的下载器点击继续勾选“使用C的桌面开发”和“Visual Studio扩展开发”点击“安装位置”&#xff0c;对vs的安装位置进行更改。你可以跟我一样只选择D盘或者其他你空闲的盘&#xff0c;然后将默认的路径…

AIGC文本生成

文本生成是一种人工智能技术&#xff0c;它基于深度学习算法&#xff0c;根据给定的提示信息创作出有逻辑、连贯的文本内容。 文本生成所需的输入&#xff08;提示或Prompt&#xff09;可以是简单的关键词、一句话概述或是更复杂的指令和上下文信息。文本生成模型通过分析大量…

AR技术在电商行业中有哪些应用场景?有何优势?

AR&#xff08;增强现实&#xff09;技术在电商行业中的应用场景广泛且多样&#xff0c;为消费者带来了全新的购物体验&#xff0c;同时也为商家提供了诸多优势。51建模网为电商行业AR技术应用提供解决方案&#xff0c;以下是AR技术在电商行业中的主要应用场景及其优势&#xf…

数据结构:时间复杂度与空间复杂度

目录 算法效率时间复杂度大O渐进表示法时间复杂度计算案例 空间复杂度空间复杂度案例 复杂度算法题 算法效率 算法在编写成可执行程序后&#xff0c;运⾏时需要耗费时间资源和空间(内存)资源 。因此衡量⼀个算法的好坏&#xff0c;⼀般是从时间和空间两个维度来衡量的&#xf…

通过sshd_config限制用户登录

在CentOS Stream或其他现代的Linux发行版中&#xff0c;你可能会发现传统的hosts.deny和 hosts.allow文件已经不存在或不被使用。这是因为随着时间的推移&#xff0c;系统的安全策略和网络管理工具已经发生了演变&#xff0c;许多系统管理员和发行版维护者选择使用更现代、更灵…

12. DataLoader的基本使用

DataLoader的基本使用 1. 为什么要使用DataLoader DataLoader对创建好的DataSet的样本取样进行了集成操作&#xff0c;非常方便对于后续网络训练、测试的数据集的选择和使用 DataLoader可以集成了数据批量加载的方法&#xff0c;可以使用 batch_size 设置批量大小&#xff0c…

深入理解 Redis 的文件事件处理器

概述 Redis 的文件事件处理器是基于 Reactor 模式实现的&#xff0c;内部采用 IO 多路复用程序来同时监听多个套接字&#xff0c;当被监听的套接字准备好执行连接应答&#xff08;accept&#xff09;、读取&#xff08;read&#xff09;、写入&#xff08;write&#xff09;、…

计算机毕业设计 高校大学生竞赛项目管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…