滑动窗口2

1. 水果成篮(904)

题目描述:
在这里插入图片描述
算法原理:
根据题目意思,friuts表示第i棵树上的水果种类,然后我们有两个篮子去在这些树上去采水果,但是有限制就是一个篮子里就只能装一种水果,也就是我们在根据fruits数组去采摘水果的时候,水果种类达到第三种的时候就立刻停止采摘。
综上我们可以先定义一个hash表,类型为(int,int),第一个序号表示水果的种类,第二个序号表示这种水果在篮子中的总数。此时我们就可以将这里的问题想成滑动窗口问题,根据我们之前总结的滑动窗口的问题,不难发现这里的进窗口就是直接根据fruits数组放入水果的过程,当hash表的size也就是水果种类大于2时,就开始出窗口,对于出窗口的过程首先将fruit[left]对应得水果种类在hash表中的数量减一,然后注意如果此时对应种类的水果数量为0那么就要在hash表中移除这种水果也就是hash表的size减一,最后照旧left++,然后重复上述出窗口的操作,直至篮子中的水果种类等于二时跳出,此时篮子中的水果就是满足题目条件的,因此我们就可以去更新返回值也就是篮子中水果的最大数目。具体看代码。
代码如下:

class Solution {public int totalFruit(int[] fruits) {int n = fruits.length;int ret = 0;Map<Integer, Integer> map = new HashMap<Integer, Integer>();for (int left = 0, right = 0; right < n; right++) {int in = fruits[right];map.put(in, map.getOrDefault(in, 0) + 1);while (map.size() > 2) {int out = fruits[left];map.put(out, map.get(out) - 1);if (map.get(out) == 0) {map.remove(out);}left++;}ret = Math.max(ret, right - left + 1);}return ret;}
}

题目链接

2. 找到字符串中所有字母异位词(438)

题目描述:
在这里插入图片描述
算法原理:
首先明白题目给出的异位词是什么意思,举例来说就是"abc"和"bac"互为异位词,就是说一个字符串如果是另一个字符串打乱顺序后的结果就是它的异位词,很好理解。
然后题目要求我们去在字符串s的子串中去找到字符串p的异位词,理解了以上内容我们就可以使用滑动窗口的方法去解决这个问题。
我们先使用一个数组来记录字符串p的各个字符的数量,然后开始基于字符串s来进行进窗口的操作,也是使用一个数组来记录各个进窗口的字符数量,当进窗口的字符数量超过字符串p中的字符数量时开始出窗口,首先对数组中的s[left]对应字符的数量减一,之后left++,当窗口内的字符数量恢复到p中的字符数量时跳出循环,然后判断,p字符串的保存各字符数量的数组和此时保存窗口内各字符数量的数组是否相等,如果相等那么此时就更新结果,也就是更新返回的起始索引,即窗口左边的索引。
代码如下:

class Solution {public List<Integer> findAnagrams(String ss, String p) {List<Integer> ret = new ArrayList<>();int[] arrP = new int[26];int[] arrS = new int[26];char[] s = ss.toCharArray();for (char ch : p.toCharArray()) {arrP[ch - 'a']++;}int n = ss.length();int m = p.length();for (int left = 0, right = 0; right < n; right++) {arrS[s[right] - 'a']++;while (right - left + 1 > m) {arrS[s[left++] - 'a']--;}if (Arrays.equals(arrP, arrS)) {ret.add(left);}}return ret;}
}

优化:
当我们使用数组比较这种方法来验证是否当前窗口下的字符构成字符串p的异位词时,虽然代码是可以直接使用Arrays类的静态方法equals来比较,但是内部肯定是需要一个循环来实现的,因此我们对代码进行优化。
相对于前面的代码,这里优化的代码只需要加上一个count变量,这是用来记录窗口内的有效字符数量。那么什么是有效字符,就是在字符串p中包含的字符,但是一旦加入窗口中的单种字符个数超过字符串p中的对应的字符数量,那么这个字符也不是有效字符。例如字符串p为"abc"此时窗口内字符为"aab"此时有效字符数量为2。
因此在进窗口时对s[right]进行判断,是否此时窗口内该字符的数量在加一后是小于等于p字符串中相同字符的数量的,只有这样count才能加一。当窗口内的字符数量超出字符串p的字符数量时开始出窗口,此时也要进行判断是否s[left]出窗口后,窗口内的对应字符数量是否小于p中相同字符的数量,如果小于count才能减一。跳出出窗口循环后就进行判断,是否此时窗口内有效字符数量count和p字符长度相等,如果相等就说明窗口内字符是p的异位词,更新返回结果。
优化后代码:

class Solution {public List<Integer> findAnagrams(String ss, String p) {List<Integer> ret = new ArrayList<>();int[] arrP = new int[26];int[] arrS = new int[26];char[] s = ss.toCharArray();int count = 0;for (char ch : p.toCharArray()) {arrP[ch - 'a']++;}int n = ss.length();int m = p.length();for (int left = 0, right = 0; right < n; right++) {arrS[s[right] - 'a']++;if (arrS[s[right] - 'a'] <= arrP[s[right] - 'a']) {count++;}while (right - left + 1 > m) {arrS[s[left] - 'a']--;if (arrS[s[left] - 'a'] < arrP[s[left] - 'a']) {count--;}left++;}if (count == m) {ret.add(left);}}return ret;}
}

题目链接

3. 串联所有单词的子串(30)

题目描述:
在这里插入图片描述

算法原理:
这一题和上一题异位词如出一辙,做题的思想完全一致,只不过上一题进窗口出窗口的单位是字符,这一题则是一个子串,也是用到了上一题当中的优化的使用count计数的方法。然后需要注意一个不一样的点就是,因为每次进窗口出窗口的字符串单位不一定是总的字符串s的因子,所以为了遍历各种可能我们需要在最外层再多套上一层循环,具体看代码。
代码如下:

class Solution {public List<Integer> findSubstring(String s, String[] words) {int len = words[0].length();int aim = words.length;List<Integer> list = new ArrayList<>();HashMap<String, Integer> hash = new HashMap<>();for (String str : words) {hash.put(str, hash.getOrDefault(str, 0) + 1);}int n = s.length();for (int i = 0; i < len; i++) {HashMap<String, Integer> temp = new HashMap<>();for (int left = i, right = i, count = 0; right + len <= n; right += len) {String in = s.substring(right, right + len);temp.put(in, temp.getOrDefault(in, 0) + 1);if (hash.getOrDefault(in, 0) != 0 && temp.get(in) <= hash.get(in)) {count++;}while (right - left + 1 > aim * len) {String out = s.substring(left, left + len);temp.put(out, temp.get(out) - 1);if (hash.getOrDefault(out, 0) != 0 && temp.get(out) < hash.get(out)) {count--;}left += len;}if (count == aim) {list.add(left);}}}return list;}
}

题目链接

4. 最小覆盖子串(76)

题目描述:
在这里插入图片描述

算法原理:
还是根据第二题异位词的方法,使用count计数的方式来完成这题,但是与前者不同的在于前者要求满足的子串必须每一个字符及其数量和t要一一对应,但是这一题不一样,它只需要将t的各个字符包含进子串即可,因此我们这里选择使用count来表达字符的种类,当窗口内的相应的字符种类达到要求时就进入出窗口的循环。对于返回值的更新直接放到出窗口循环当中了,因为此时的窗口范围的子串都是满足题目条件的直接更新就可以了。
代码如下:

class Solution {public String minWindow(String ss, String tt) {Map<Character, Integer> hash1 = new HashMap<>();Map<Character, Integer> hash2 = new HashMap<>();char[] s = ss.toCharArray();char[] t = tt.toCharArray();for (char ch : t) {hash1.put(ch, hash1.getOrDefault(ch, 0) + 1);}int n = ss.length();int aim = hash1.size();int minL = Integer.MAX_VALUE;int begin = -1;for (int left = 0, right = 0, count = 0; right < n; right++) {char in = s[right];hash2.put(in, hash2.getOrDefault(in, 0) + 1);if (hash1.containsKey(in) && hash1.get(in).equals(hash2.get(in))) {count++;}while (count == aim) {if ((right - left + 1) < minL) {minL = right - left + 1;begin = left;}char out = s[left];hash2.put(out, hash2.get(out) - 1);if (hash1.containsKey(out) && hash2.get(out) < hash1.get(out)) {count--;}left++;}}return begin == -1 ? "" : ss.substring(begin, begin + minL);}
}

题目链接

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

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

相关文章

RK35x8通过TFTP下载内核到开发板

对于有网线接口的RK35X8开发板&#xff0c;调试时候&#xff0c;可以通过网线下载内核镜像和设备树到开发板&#xff0c;不用每次修改驱动都要重新打开下载工具&#xff0c;进入下载模式。通过TFTP可以大大提高调试效率。 在ubuntu安装TFTP服务 安装tftp服务器 sudo apt-get…

【笔记】Spring Cloud Gateway 实现 gRPC 代理

Spring Cloud Gateway 在 3.1.x 版本中增加了针对 gRPC 的网关代理功能支持,本片文章描述一下如何实现相关支持.本文主要基于 Spring Cloud Gateway 的 官方文档 进行一个实践练习。有兴趣的可以翻看官方文档。 由于 Grpc 是基于 HTTP2 协议进行传输的&#xff0c;因此 Srping …

鸿蒙 如何 url decode

在 TypeScript 和 JavaScript 中进行 URL 编码的最简单方式是使用内置的 global 函数 encodeURIComponent()。以下是一个示例&#xff1a; let url "https://example.com/?name测试&job开发者"; let encodedURL encodeURIComponent(url); console.log(encode…

【RAG】FoRAG:面向网络增强型长形式问答的事实性优化RAG

一、解决问题 在基于网络的长形式问答&#xff08;Web-enhanced Long-form Question Answering, LFQA&#xff09;任务中&#xff0c;现有RAG在生成答案时存在的问题&#xff1a; 事实性不足&#xff1a;研究表明&#xff0c;现有系统生成的答案中只有大约一半的陈述能够完全得…

Qt开发笔记:Qt3D三维开发笔记(一):Qt3D三维开发基础概念介绍

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://blog.csdn.net/qq21497936/article/details/140059315 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、O…

来自Claude官方的提示词库,支持中文!建议收藏!

大家好,我是木易,一个持续关注AI领域的互联网技术产品经理,国内Top2本科,美国Top10 CS研究生,MBA。我坚信AI是普通人变强的“外挂”,所以创建了“AI信息Gap”这个公众号,专注于分享AI全维度知识,包括但不限于AI科普,AI工具测评,AI效率提升,AI行业洞察。关注我,AI之…

多元时间序列分析——VAR(向量自回归模型)

VAR模型主要是考察多个变量之间的动态互动关系&#xff0c;从而解释各种经济冲击对经济变量形成的动态影响。这种动态关系可通过格兰杰因果关系、脉冲响应以及方差分解来进一步明确和可视化。VAR模型主要研究内生变量之间的关系&#xff0c;内生变量就是参与模型并由模型体系内…

通天星CMSV6车载监控平台CompanyList信息泄露漏洞

1 漏洞描述 通天星CMSV6车载视频监控平台是东莞市通天星软件科技有限公司研发的监控平台,通天星CMSV6产品覆盖车载录像机、单兵录像机、网络监控摄像机、行驶记录仪等产品的视频综合平台。通天星科技应用于公交车车载、校车车载、大巴车车载、物流车载、油品运输车载、警车车…

推荐一款程序员的搞钱神器

你是不是经常为开发环境的搭建而头疼&#xff1f;有没有遇到过因为接口开发而焦头烂额的情况&#xff1f;作为一名程序员&#xff0c;特别是独立开发者&#xff0c;这些问题是不是常常让你觉得心力交瘁&#xff1f;别担心&#xff0c;现在有一个神器&#xff0c;能让你摆脱这些…

2024HVV最新POC/EXP,目前有8000+个POC/EXP

点击"仙网攻城狮”关注我们哦~ 不当想研发的渗透人不是好运维 让我们每天进步一点点 简介 都是网上收集的POC和EXP&#xff0c;最新收集时间是2024年五月&#xff0c;需要的自取。 表里没有的可以翻翻之前的文章&#xff0c;资源比较零散没有整合起来。 文件链接&#xff…

阿里云智能编程助手的安装使用

https://help.aliyun.com/document_detail/2590613.html 通义灵码&#xff0c;是阿里云出品的一款基于通义大模型的智能编码辅助工具&#xff0c;提供行级/函数级实时续写、自然语言生成代码、单元测试生成、代码优化、注释生成、代码解释、研发智能问答、异常报错排查等能力&a…

洞察数据资产的奥秘:深入剖析数据资产在企业运营中的核心作用,提出一套全面、系统的数据资产解决方案,帮助企业实现数据资产的最大化利用和增值

一、引言 在数字化浪潮汹涌的今天&#xff0c;数据已成为企业最宝贵的资产之一。数据资产不仅记录了企业的历史运营轨迹&#xff0c;更蕴含着指导未来决策的智慧。然而&#xff0c;如何有效管理、利用这些数据资产&#xff0c;使其转化为企业的竞争优势和利润增长点&#xff0…

python--基础篇--正则表达式--py脚本--题目解答

文章目录 验证输入用户名和QQ号是否有效并给出对应的提示信息从一段文字中提取出国内手机号码替换字符串中的不良内容拆分长字符串 验证输入用户名和QQ号是否有效并给出对应的提示信息 """ 验证输入用户名和QQ号是否有效并给出对应的提示信息要求&#xff1a;用…

扎克伯格抨击闭源人工智能竞争对手试图“创造上帝”

Meta 首席执行官马克-扎克伯格&#xff08;Mark Zuckerberg&#xff09;在周四发表的一篇访谈中谈到了他对人工智能未来的看法&#xff0c;他深信"不会只有一种人工智能"。扎克伯格强调了开源的价值&#xff0c;即把人工智能工具交到许多人手中&#xff0c;他还不忘贬…

抖音微短剧小程序源码搭建:实现巨量广告数据高效回传

在数字化营销日益盛行的今天&#xff0c;抖音微短剧小程序已成为品牌与观众互动的新渠道。这些短小精悍的剧目不仅能迅速抓住用户的注意力&#xff0c;还能有效提升品牌的知名度和用户黏性。然而&#xff0c;想要充分利用这一营销工具&#xff0c;关键在于如何高效地追踪广告数…

springboot中使用springboot cache

前言&#xff1a;SpringBoot中使用Cache缓存可以提高对缓存的开发效率 此图片是SpringBootCache常用注解 Springboot Cache中常用注解 第一步&#xff1a;引入依赖 <!--缓存--><dependency><groupId>org.springframework.boot</groupId><artifactId…

STM32第十一课:ADC采集光照

文章目录 需求一、ADC概要二、实现流程1.开时钟&#xff0c;分频&#xff0c;配IO2.配置ADC工作模式3.配置通道4.复位校准5.数值的获取 三、需求的实现总结 需求 通过ADC转换实现光照亮度的数字化测量&#xff0c;最后将实时测量的结果打印在串口上。 一、ADC概要 ADC全称是A…

手机数据恢复篇:如何在Android手机上查找和恢复已删除的文件

移动设备中的回收站已成为 Android 用户的一项基本功能&#xff0c;它提供了防止意外删除的安全网。与计算机一样&#xff0c;移动回收站会临时存储已删除的文件&#xff0c;允许用户在需要时检索它们。此功能在当今的数字时代特别有用&#xff0c;因为只需轻轻一按&#xff0c…

SEO与AI的结合:如何用ChatGPT生成符合搜索引擎优化的内容

在当今数字时代&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;已成为每个网站和内容创作者都必须掌握的一项技能。SEO的主要目标是通过优化内容&#xff0c;使其在搜索引擎结果页面&#xff08;SERP&#xff09;中排名更高&#xff0c;从而吸引更多的流量。然而&#xf…

硬件实用技巧:刚挠板pcb是什么

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/140060334 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…