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

leetcode hot100_part4_子串

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都不会再满足条件

        

相关文章:

leetcode hot100_part4_子串

2024/4/20—4/21 560.和为K的子数组 前缀和哈希表&#xff0c;做二叉树的时候也有这个套路。注意细节&#xff0c;遍历到当前前缀和的时候是先找结果个数还是先加入哈希&#xff1f;应该先找结果个数&#xff0c;不然的话&#xff0c;当前位置也算上了&#xff08;因为是前缀和…...

Spring Cloud之三 网关 Gateway

1:Intellij 新建项目 spring-cloud-gateway 2:pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLoca…...

Linux 进程1

进程 在linux系统中&#xff0c;触发任何一个事件时系统会将其定义为一个进程&#xff08;一个程序开始执行&#xff09;&#xff0c;系统会给这个进程分配一个进程ID统称为PID。 程序&#xff1a;通常是二进制文件&#xff0c;放置于存储媒介如硬盘中。 进程&#xff1a;当存…...

LeetCode: 2552. 统计上升四元组 动态规划 时间复杂度O(n*n)

2552. 统计上升四元组 today 2552. 统计上升四元组 题目描述 给你一个长度为n下标从 0 开始的整数数组 nums &#xff0c;它包含1到n的所有数字&#xff0c;请你返回上升四元组的数目。 如果一个四元组 (i, j, k, l) 满足以下条件&#xff0c;我们称它是上升的&#xff1a;…...

Unity 编辑器设置中文

在 Unity 编辑器中&#xff0c;你可以按照以下步骤将语言设置为中文&#xff1a; 步骤&#xff1a; 1. 打开 Unity 编辑器。 2. 在顶部菜单栏&#xff0c;依次点击 Edit > Preferences&#xff08;在 macOS 上是 Unity > Preferences&#xff09;。 3. 在弹出的 Preferen…...

springboot-创建连接池

操作数据库 代码开发步骤&#xff1a; pom.xml文件配置依赖properties文件配置连接数据库信息&#xff08;连接池用的是HikariDataSource&#xff09;数据库连接池开发 configurationproperties和value注解从properties文件中取值bean方法开发 service层代码操作数据库 步骤&am…...

matlab绘制不同区域不同色彩的图,并显示数据(代码)

绘图结果如下&#xff1a; 代码如下&#xff1a; A为绘图的数据&#xff0c;每个数据对应着上图中的一个区域&#xff0c;数据大小决定区域的颜色 % 假设有一系列的数据点 Arand(5,6); %A为绘图的数据&#xff0c;数据大小决定颜色 wei_shu%.3f; %代表数据保留三位小…...

Docker Desktop 的安装与汉化指南

前言 Docker Desktop 是一款非常流行的开发工具&#xff0c;它使得开发者能够在自己的计算机上轻松地构建、运行和调试 Docker 容器。然而&#xff0c;默认情况下&#xff0c;Docker Desktop 的界面是英文的&#xff0c;对于中文用户来说&#xff0c;有时候会觉得不够友好。幸…...

前端form表单+ifarme方式实现大文件下载

// main.jsimport Vue from vue; import App from ./App.vue; import { downloadTokenFile } from /path/to/your/function; // 替换为您的函数路径// 将 downloadTokenFile 添加到 Vue 原型上 Vue.prototype.$downloadTokenFile downloadTokenFile;new Vue({el: #app,render:…...

Leetcode面试经典150题-141.环形链表

题目比较简单&#xff0c;重点是理解思想 解法都在代码里&#xff0c;不懂就留言或者私信 /*** Definition for singly-linked list.* class ListNode {* int val;* ListNode next;* ListNode(int x) {* val x;* next null;* }* }*/ public…...

sh文件执行提示语法错误: 未预期的文件结尾

在执行sh文件时总是提示&#xff1a;语法错误: 未预期的文件结尾&#xff0c;尝试删除最后的空格也不对 最后发现在notepad中转换的问题 需要把windows换成unix就行了...

基于SpringBoot的甜品店管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的蛋糕甜品店管理系…...

动态规划-不同的子序列

题目描述 给你两个字符串 s 和 t &#xff0c;统计并返回在 s 的 子序列 中 t 出现的个数&#xff0c;结果需要对 109 7 取模。 示例&#xff1a; 输入&#xff1a;s "babgbag", t "bag" 输出&#xff1a;5 解释&#xff1a; 如下所示, 有 5 种可以从…...

如何通过OceanBase的多级弹性扩缩容能力应对业务洪峰

每周四晚上的10点&#xff0c;都有近百万的年轻用户进入泡泡玛特的抽盒机小程序&#xff0c;共同参与到抢抽盲盒新品的活动中。瞬间的并发流量激增对抽盒机小程序的系统构成了巨大的挑战&#xff0c;同时也对其数据库的扩容能力也提出了更高的要求。 但泡泡玛特的工程师们一点…...

D - 1D Country(AtCoder Beginner Contest 371)

题目链接: D - 1D Country (atcoder.jp) 题目描述: 数据范围: 输入输出: 题目分析: 典型的l, r 区间问题&#xff0c;即是前缀和问题&#xff0c;但是注意到数据范围, 数据范围1e-9 到 1e9 数据范围&#xff0c;要是从最小到最大直接for循环去模拟的话&#xff0c;时间复杂度…...

怎么很多张图片拼接成一张?试试这几种图片拼接方法!

怎么很多张图片拼接成一张&#xff1f;在繁忙的现代生活中&#xff0c;我们不断地捕捉和累积着各式各样的图像&#xff0c;它们如同记忆的珍珠&#xff0c;串联起生活的每一个瞬间&#xff0c;然而&#xff0c;随图片数量的激增&#xff0c;管理它们成为了一项挑战&#xff0c;…...

Python实现优化的分水岭算法

目录 优化分水岭算法的博客1. 分水岭算法优化概述2. 优化分水岭算法的步骤3. Python实现优化后的分水岭算法4. 实例&#xff1a;优化分水岭算法在图像分割中的应用5. 总结 优化分水岭算法的博客 分水岭算法是一种强大的图像分割方法&#xff0c;特别适用于分离不同的对象和区域…...

智慧交通基于yolov8的行人车辆检测计数系统python源码+onnx模型+精美GUI界面

【算法介绍】 智慧交通中&#xff0c;基于YOLOv8的行人车辆检测计数系统是一项高效、准确的技术解决方案。该系统利用YOLOv8这一先进的目标检测算法&#xff0c;结合深度学习技术&#xff0c;能够实时检测并准确计数道路上的行人和车辆。YOLOv8在保证检测速度的同时&#xff0…...

Linux开发工具的使用

文章目录 vim的使用基本模式介绍光标当前行操作&#xff08;命令行模式&#xff09;光标快速定位&#xff08;命令行模式&#xff09;&#xff1a;插入模式的三种方式&#xff08;命令行模式&#xff09;&#xff1a;vim基本操作&#xff08;命令行模式&#xff09;底行模式的操…...

【devops】devops-git之介绍以及日常使用

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…...

保姆级教程:在Ubuntu 20.04上从源码编译aarch64-linux-gnu交叉工具链(GCC 9.2.0 + Glibc 2.30)

深度实践&#xff1a;从源码构建aarch64-linux-gnu交叉工具链全指南 在嵌入式开发领域&#xff0c;交叉编译工具链的构建能力是区分普通开发者与资深工程师的重要标志。当现成的预编译工具链无法满足特定需求时&#xff0c;从源码手动构建工具链不仅能解决兼容性问题&#xff0…...

终极免费城通网盘直连解析工具:告别下载限速的完整指南

终极免费城通网盘直连解析工具&#xff1a;告别下载限速的完整指南 【免费下载链接】ctfileGet 获取城通网盘一次性直连地址 项目地址: https://gitcode.com/gh_mirrors/ct/ctfileGet 还在为城通网盘下载速度慢、等待时间长而烦恼吗&#xff1f;ctfileGet是一款专为城通…...

镜像空间全域透视,赋能多维场景一体化透明数智治理技术白皮书

镜像空间全域透视&#xff0c;赋能多维场景一体化透明数智治理技术白皮书副标题&#xff1a;聚合动态三维实时重构、无感厘米级定位、全域跨镜连续追踪、身体指纹生物核验四大自研核心&#xff0c;一站式覆盖楼宇、仓储、硐室全场景透明智能管控前言当下城市建筑楼宇、物资仓储…...

Iris API错误处理机制与嵌入式系统优化实践

1. Iris API错误处理机制解析在嵌入式系统开发中&#xff0c;API的健壮性直接影响整个系统的稳定性。Iris框架作为ARM架构下的核心组件&#xff0c;其错误处理机制基于JSON-RPC 2.0规范进行了深度定制&#xff0c;特别适合资源受限的嵌入式环境。与通用Web API不同&#xff0c;…...

紧急更新!Midjourney 6.2.1已悄然修复碳素印相的硫化银衰减模拟缺陷——但97%用户仍在用旧参数,立即校准你的工作流

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;碳素印相的视觉本质与Midjourney 6.2.1修复的底层动因 碳素印相的物质性光感逻辑 碳素印相并非数字渲染的模拟&#xff0c;而是一种基于明胶-碳黑颗粒物理沉积的连续调成像工艺。其高密度阴影区呈现哑…...

Python自动化股票分析工具:从数据采集到可视化报告全流程实战

1. 项目概述&#xff1a;一个面向个人投资者的自动化股票分析工具如果你和我一样&#xff0c;是个对A股市场有点兴趣&#xff0c;但又没时间天天盯盘的上班族&#xff0c;那你肯定也经历过这种纠结&#xff1a;早上开盘前想看看心仪的几只股票有没有什么异动&#xff0c;结果一…...

火灾动力学模拟实战:如何用FDS构建精准的火灾预测系统

火灾动力学模拟实战&#xff1a;如何用FDS构建精准的火灾预测系统 【免费下载链接】fds Fire Dynamics Simulator 项目地址: https://gitcode.com/gh_mirrors/fd/fds 你是否曾面临这样的困境&#xff1a;当设计一栋大型商业建筑时&#xff0c;如何科学评估火灾时的人员疏…...

Arduino驱动128x64 VFD显示屏:SPI像素回读与图形应用实战

1. 项目概述&#xff1a;为什么选择128x64图形VFD&#xff1f;如果你玩过各种OLED、LCD或者TFT屏幕&#xff0c;可能会觉得显示技术已经足够成熟&#xff0c;亮度、对比度似乎都够用。但当你第一次点亮一块真空荧光显示屏时&#xff0c;那种独特的、带着一丝复古科技感的蓝色辉…...

基于Electron的ChatGPT桌面客户端开发:架构、功能与进阶实践

1. 项目概述&#xff1a;一个开源桌面客户端的诞生与价值如果你和我一样&#xff0c;在日常开发、写作或者处理一些需要深度思考的任务时&#xff0c;经常需要和ChatGPT这样的AI助手对话&#xff0c;那你一定对在浏览器里反复切换标签页、刷新页面、管理冗长的对话历史感到厌烦…...

Python Pydantic介绍(数据校验、自动类型转换、结构化数据建模、序列化JSON、配置管理)pydantic-settings、核心BaseModel、字段约束Field()、FastAPI

文章目录Python 数据校验神器&#xff1a;Pydantic 完全指南一、什么是 Pydantic二、Pydantic 能解决什么问题1&#xff09;数据校验&#xff08;Validation&#xff09;2&#xff09;自动类型转换&#xff08;Parsing&#xff09;3&#xff09;结构化数据建模4&#xff09;序列…...