代码随想录:长度最小的子数组相关题目推荐(904、76)

904.水果成篮

题目

你正在探访一家农场,农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示,其中 fruits[i] 是第 i 棵树上的水果 种类 。

你想要尽可能多地收集水果。然而,农场的主人设定了一些严格的规矩,你必须按照要求采摘水果:

  • 你只有 两个 篮子,并且每个篮子只能装 单一类型 的水果。每个篮子能够装的水果总量没有限制。
  • 你可以选择任意一棵树开始采摘,你必须从 每棵 树(包括开始采摘的树)上 恰好摘一个水果 。采摘的水果应当符合篮子中的水果类型。每采摘一次,你将会向右移动到下一棵树,并继续采摘。
  • 一旦你走到某棵树前,但水果不符合篮子的水果类型,那么就必须停止采摘。

给你一个整数数组 fruits ,返回你可以收集的水果的 最大 数目。

示例 1:

输入:fruits = [1,2,1]
输出:3
解释:可以采摘全部 3 棵树。

示例 2:

输入:fruits = [0,1,2,2]
输出:3
解释:可以采摘 [1,2,2] 这三棵树。
如果从第一棵树开始采摘,则只能采摘 [0,1] 这两棵树。

示例 3:

输入:fruits = [1,2,3,2,2]
输出:4
解释:可以采摘 [2,3,2,2] 这四棵树。
如果从第一棵树开始采摘,则只能采摘 [1,2] 这两棵树。

示例 4:

输入:fruits = [3,3,3,1,2,1,1,2,3,3,4]
输出:5
解释:可以采摘 [1,2,1,1,2] 这五棵树。

代码(哈希表)

class Solution {public int totalFruit(int[] fruits) {HashMap<Integer,Integer> map = new HashMap<>();int left = 0;  //滑动窗口左区间int right = 0;  //滑动窗口右区间int ans = -1;  //长度//right遍历数组while(right < fruits.length){//把right加入窗口(right可能不存在)map.put(fruits[right],map.getOrDefault(fruits[right],0)+1);//只要水果种类大于2,不断缩小窗口,左区间右移while(map.size() > 2){//left右移map.put(fruits[left],map.get(fruits[left])-1); //left的key对应的value减1//如果left长度为0,从hash表中删除if(map.get(fruits[left]) == 0){map.remove(fruits[left]);  //根据key移除left种类}left++;  //left已经从滑动窗口里删除了,left++}ans = Math.max(ans,right-left+1); //更新最大区间ansright++;  //扩大窗口,right右移继续遍历}return ans;}
}

总结

        题目看着很绕,其实就要找一个最大的连续数组(数字种类小于等于2)而已。

        查找方法就是用滑动窗口,left和right固定。

        然后,right遍历水果数组,把right种类put到哈希表中(key是水果种类,value是出现次数)。map存储的是当前left和right窗口中的水果种类和对应的数量。

        如果map的大小>2,即水果种类大于2,就要缩小窗口,修改map,map中key为left的value减1。如果value为0,直接把left从map中remove。然后,left右移,直到size小于2。

        最后,更新最大长度ans结果,right++继续遍历。

76.最小覆盖子串

题目

给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" 。

注意:

  • 对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。
  • 如果 s 中存在这样的子串,我们保证它是唯一的答案。

示例 1:

输入:s = "ADOBECODEBANC", t = "ABC"
输出:"BANC"
解释:最小覆盖子串 "BANC" 包含来自字符串 t 的 'A'、'B' 和 'C'。

示例 2:

输入:s = "a", t = "a"
输出:"a"
解释:整个字符串 s 是最小覆盖子串。

示例 3:

输入: s = "a", t = "aa"
输出: ""
解释: t 中两个字符 'a' 均应包含在 s 的子串中,
因此没有符合条件的子字符串,返回空字符串。

代码(哈希表)

class Solution {//tmap保存t字符串对应的哈希表HashMap<Character,Integer> tmap = new HashMap<>();//smap保存s字符串对应的哈希表,保存滑动窗口的字符串哈希表HashMap<Character,Integer> smap = new HashMap<>();public String minWindow(String s, String t) {//先遍历t,转为tmapfor(int i=0;i < t.length();i++){char c = t.charAt(i);  //获取字符ctmap.put(c,tmap.getOrDefault(c,0)+1); //把c加入tmap中}int minlen = Integer.MAX_VALUE;  //最小长度int minleft = -1;  //minlen对应的左指针int minright = -1;  //minlen对应的右指针int left = 0;  //滑动窗口左区间int right = 0;  //滑动窗口右区间//再遍历swhile(right < s.length()){char c = s.charAt(right);  //获取s中的right字符smap.put(c,smap.getOrDefault(c,0)+1);//判断smap是不是>=tmap,即smap是否可行while(check()){  //smap可行int length = right - left + 1;  //计算当前窗口大小//更新最小窗口大小和对应的指针if(length < minlen){minlen = length;minleft = left;minright = right;}//当前可行窗口以及记录好了,要缩小区间了char ch = s.charAt(left);smap.put(ch,smap.get(ch)-1);//这个if不写也行if(smap.get(ch) == 0){smap.remove(ch);  }left++;}right++;  //窗口扩大,right右移}return minlen == Integer.MAX_VALUE ? "" : s.substring(minleft,minright+1);}//只有smap中的key和count都满足了,smap才是可行哈希表public boolean check(){//遍历tmap,判断每个key对应的value,再smap中是否够了for(Map.Entry<Character,Integer> entry : tmap.entrySet()){char key = entry.getKey();  //获取tmap的keyint value = entry.getValue();  //获取tmap的value//看看smap中是否存在这个key,且value值要>=tmap中的if(smap.getOrDefault(key,0) < value){return false; //说明这个entry的smap就已经不可行了}}return true; //tmap中每个entry,smap都满足,说明smap可行}
}

总结

        先用tmap存储t字符串对应的keyvalue哈希表。然后用smap存储s字符串滑动窗口对应的哈希表。用滑动窗口遍历smap,用left和right固定。

        先把当前right字符put到smap中。然后循环判断smap是否满足可行要求。

        如果不满足,继续扩大窗口,right右移。

        如果满足,就要更新minlen最小长度以及对应的区间指针,同时,把smap的entry进行缩小修改。

        最后,当right遍历完s字符串后,返回minleft和minright对应的子字符串即可。

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

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

相关文章

三. TensorRT基础入门-ONNX注册算子的方法

目录 前言0. 简述1. 执行一下我们的python程序2.转换swin-tiny时候出现的不兼容op的例子3. 当出现导出onnx不成功的时候&#xff0c;我们需要考虑的事情4. unsupported asinh算子5. unsupported deformable conv算子总结参考 前言 自动驾驶之心推出的 《CUDA与TensorRT部署实战…

MR混合现实情景实训教学系统在室内设计课堂上的应用

MR混合现实情景实训教学系统在室内设计课堂上的应用可以带来许多积极的影响&#xff0c;包括提高学生的参与度、增强学生的实践技能、以及提供更真实和全面的学习体验。 首先&#xff0c;MR混合现实情景实训教学系统能够创建出一种沉浸式的环境&#xff0c;使学生能够直接接触到…

EmotiVoice 实时语音合成TTS

参考:https://github.com/netease-youdao/EmotiVoice 测试整体速度可以 docker安装: 运行容器:默认运行了两个服务,8501 一个streamlit页面,另外8000是一个api接口服务 docker run -dp 8501:8501 -p 8250:8000 syq163/emoti-voice:latest ##gpu运行 docker run --gpus a…

前端页面 贴边拖拽 盒子

vue 悬浮球(带自动吸附功能)_vue悬浮球-CSDN博客

windows内存管理-检查内存可用性

在驱动程序开发中&#xff0c;对内存的操作要格外小心。如果某段内存是只读的&#xff0c;而驱动程序试图去写操作&#xff0c;会导致系统的崩溃。同样&#xff0c;当某段内存是不可读的情况下&#xff0c;驱动程序试图去读&#xff0c;同样会导致系统的崩溃。 DDK提供了两个函…

第四届微调——炼丹

学习地址&#xff1a;Tutorial/xtuner/README.md at main InternLM/Tutorial GitHub 笔记 微调是一种在已有的预训练模型基础上&#xff0c;通过使用新的数据对模型进行进一步优化和调整的技术手段。它的目的是使模型能够更好地适应特定的应用场景和任务需求&#xff0c;进一…

基础ArkTS组件:帧动画,内置动画组件,跑马灯组件(HarmonyOS学习第三课【3.6】)

帧动画 帧动画也叫序列帧动画&#xff0c;其原理就是在时间轴的每帧上逐帧绘制不同的内容&#xff0c;使其连续播放而成动画。ArkUI开发框架提供了 ImageAnimator 组件实现帧动画能力&#xff0c;本节笔者介绍一下 ImageAnimator 组件的简单使用。 官方文献 说明 该组件从A…

9. SVG中的text元素

SVG (Scalable Vector Graphics) 提供了强大的文本渲染能力&#xff0c;其中<text>元素是常用 的文本操作的元素。本文将详细介绍<text>标签的基本使用方法&#xff0c;并展示如何通过<tspan>和<textPath>增强文本的表现力。 <text>标签基础 &…

防爆巡检手持终端在燃气巡检作业中的应用

在燃气巡检作业中&#xff0c;安全始终是首要考虑的因素。面对易燃易爆的燃气环境&#xff0c;传统的巡检方式已经难以满足现代安全管理的需求。随着科技的不断进步&#xff0c;防爆巡检手持终端应运而生&#xff0c;成为燃气巡检作业的得力助手。这些终端不仅具备高度的防爆性…

Python实现cookie续期

Python实现网页保持登录状态的技术方案 用来维护网页的登录状态&#xff0c;方法各有利弊。 使用Cookies直接管理 如果你能够访问并管理网站的cookies&#xff0c;你可以直接在请求中发送这些cookies来维持登录状态&#xff0c;而不是依赖于会话机制。这适用于那些登录信息主…

【数轮】数论、质数、最大公约数、菲蜀定理

数学 唯一分解定理 n>2都可以表示为质因数的乘方。 令 n a1b1a2b2 … \dots … a1,b1 … \dots …都是质因数&#xff0c;b1,b2 … \dots …是对应质因数的数量。 调和级数 11/2 1/3 1/4 ⋯ \cdots ⋯ 1/ n 约等于 logn。 证明过程&#xff1a; 1/3 1/4 < (1/2) …

Colab微调LLaMA3模型(大模型的微调)

Colab微调LLaMA3模型 1.使用的数据集 在hugging face上搜索 kigner/ruozhiba-llama3 使用的是弱智吧的数据 2.打开Colab 选择Gpu版本T2就可以了&#xff0c;然后下载unsloth这个微调框架&#xff0c;使用该框架的主要原因在于对硬件要求比较低。 在安装这个前先看一下本文…

css实现上下左右对勾选中状态角标

&#x1f365;左上角 &#x1f365;右上角 &#x1f365;左下角 &#x1f365;右下角: &#x1f365;左上角: .blueBackground {position: relative;border: 1px solid #91c7f3;background: #F0F8FF !important;&:after {content: "";position: absolute;top:…

黏土滤镜教程分享:让你的照片瞬间变身黏土艺术

在数字时代的浪潮中&#xff0c;手机摄影和修图软件成为了我们日常生活中不可或缺的一部分。而近期&#xff0c;一款名为“黏土滤镜”的修图功能火爆全网&#xff0c;让无数摄影爱好者和创意达人为之疯狂。本文将为你详细介绍几款拥有黏土滤镜功能的软件&#xff0c;并附上详细…

RiPro主题美化【支付弹窗底部提示语根据入口不同有不同的提示】ritheme主题美化RiProV2 增加支付提示语,按支付类型不同,入口不同提示语不同的设置

RiPro主题美化【支付弹窗底部提示语根据入口不同有不同的提示】ritheme主题美化RiProV2 增加支付提示语,按支付类型不同,入口不同提示语不同的设置 背景: 接上文:https://www.uu2id.com/827.html 付费组件在以下几个地方会弹出:1)文章隐藏内容付费;2)付费资源下载;3…

实时数据推送——长轮询,短轮询,长连接

短轮询 短轮询是最简单的一种数据推送方式&#xff0c;客户端在固定的时间间隔&#xff08;例如每隔5秒&#xff09;向服务器发送请求&#xff0c;询问是否有更新的数据。服务器立即处理请求并返回数据&#xff0c;不论数据是否真的已经更新。 长轮询 长轮询是对短轮询的改进…

【R语言篇】医学生福音,全球疾病负担数据库GBD 2021即将更新!!!

今天介绍即将于5月16日更新的全球疾病负担数据库GBD 2021&#xff0c;相信数据一经发表&#xff0c;过不了多久pubmed又将涌现一大波疾病负担相关文章。 Global Burden of Disease Study 2021 (GBD 2021) Data Resources | GHDx 在查找GBD相关文献方面&#xff0c;我个人还是比…

六、Web开发与MVC框架(MVC架构与控制器)

在C# Web开发中&#xff0c;MVC&#xff08;Model-View-Controller&#xff09;框架是一种广泛使用的架构模式&#xff0c;特别是在ASP.NET MVC中。MVC架构将应用程序分为三个主要部分&#xff1a;模型&#xff08;Model&#xff09;、视图&#xff08;View&#xff09;和控制器…

Redis数据结构扩容源码分析

1 Redis数据结构 redis的数据存储在dict.中&#xff0c;其数据结构为(c源码) ypedef struct dict { dictType *type; //理解为面向对象思想&#xff0c;为支持不同的数据类型对应dictType抽象方法&#xff0c;不同的数据类型可以不同实现 void *privdata; //也可不同的数据类…

10个免费视频素材网站,剪辑师们赶紧收藏!

在快速发展的数字媒体时代&#xff0c;寻找高质量的视频和音频素材成为了多数内容创作者的日常需求。无论是企业宣传、个人创作还是社交媒体更新&#xff0c;优秀的素材不仅能增强视觉效果&#xff0c;还能提高信息传播效率。以下是一些优质的免费素材网站&#xff0c;它们提供…