滑动窗口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.mfbz.cn/a/757873.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【简单讲解下OneFlow深度学习框架】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

SM2258XT量产工具,SM2258XT开卡三星SSV4颗粒成功分享,SM2259XT量产参考教程,威刚ADATA SP580开卡记录

前两天拆了笔记本上的威刚ADATA SP580 240GB&#xff0c;准备做移动硬盘用&#xff0c;装入移动硬盘盒之后接入电脑&#xff0c;发现系统可认盘&#xff0c;SMART显示正常&#xff0c;Windows的磁盘管理能显示正确容量&#xff0c;但处于未初始化状态&#xff0c;且始终无法初始…

病理性不对称引导的渐进学习用于急性缺血性脑卒中梗死分割| 文献速递-先进深度学习疾病诊断

Title 题目 Pathological Asymmetry-Guided Progressive Learning for Acute Ischemic Stroke Infarct Segmentation 病理性不对称引导的渐进学习用于急性缺血性脑卒中梗死分割 01 文献速递介绍 中风已经成为第二大致命疾病&#xff0c;大约70%的中风是缺血性的。众所周知…

AI in Law 法律领域AI应用-基于DeepNLP AI App Store 评论评测和排名

来源: quora 社区: https://deepnlpaistore.quora.com/ github: https://github.com/rockingdingo/deepnlp/blob/master/store/law.md 法律领域哪些AI服务应用更能满足用户的需求&#xff0c;排名最高? 参考deepnlp.org网站根据用户真实评论打分和show case分享&#xff0c;分…

java基于ssm+jsp 二手手机回收平台系统

1前台首页功能模块 二手手机回收平台系统&#xff0c;在系统首页可以查看首页、手机商城、新闻资讯、我的、跳转到后台、购物车等内容&#xff0c;如图1所示。 图1前台首页功能界面图 用户注册&#xff0c;在用户注册页面可以填写账号、密码、姓名、手机、邮箱、照片、地址、…

论文工具使用---connected papers

如何使用connected papers 使用方法具体功能其他资源 官网地址&#xff1a;connected papers &#xff1a;一个旨在帮助科研工作者快速搜索文献的全新工具&#xff0c;可以清晰的查看文献的引文信息&#xff0c;了解文献的引用和被引用关联。 使用方法 输入论文标题后&#xf…

如何配置Redis + Rdis在IDEA中的使用

文章目录 Step1. 下载zipStep2. 修改环境变量Step3. 启动Redis服务端Step4. 启动Redis客户端Step5. IDEA中链接Redis Step1. 下载zip 下载 Redis-x64-xxx.zip压缩包&#xff0c;解压到 E 盘后&#xff0c;将文件夹重新命名为 redis 下载地址&#xff1a;Redis下载地址 Step2…

Java----面向对象----总复习

面向对象 面向对象的程序设计思想(Object Oriented Programming),简称OOP.是一种设计者思想.关注的焦点是类,参照现实中的事务,将事务的属性特征,行为抽象出来,用类来表示.代码结构:以类为组织单位,每种事务都有自己的属性和行为,功能, 思想:从宏观上 帮助我们把握,整体分析整…

C语言的数据结构:树与二叉树(哈夫曼树篇)

前言 上篇讲完了二叉树&#xff0c;二叉树的查找性能要比树好很多&#xff0c;如平衡二叉树保证左右两边节点层级相差不会大于1&#xff0c;其查找的时间复杂度仅为 l o g 2 n log_2n log2​n&#xff0c;在两边层级相同时&#xff0c;其查找速度接近于二分查找。1w条数据&am…

160相交链表

解法1&#xff1a; public class Solution {public ListNode getIntersectionNode(ListNode headA, ListNode headB) {// 定义两个指针。// 获得两个链表的长度&#xff0c;将较长的链表先用指针移动到和短链表一样的长度。// 再一个个比较ListNode l1 headA, l2 headB;int …

vs2017调试MFC源码与dll版本不匹配

如上图&#xff0c;使用VS2017调试MFC源码&#xff0c;提示源码与dll不匹配。 经过一番折腾终于找到了原因&#xff1a;同时安装了vs2017、vs2022&#xff0c;结果加载的mfc140ud.dll不是vs2017的&#xff0c;而是vs2022的&#xff0c;主版本号虽然都是14&#xff0c;但小版本…

Jmeter下载、安装及配置

1 Jmeter介绍 Jmeter是进行负载测试的工具&#xff0c;可以在任何支持Java虚拟机环境的平台上运行&#xff0c;比如Windows、Linux、Mac。 Jmeter模拟一组用户向目标服务器发送请求&#xff0c;并统计目标服务器的性能信息&#xff0c;比如CPU、memory usage。 2 Jmeter下载 …

BLACKBOX.AI:解锁编程学习新纪元,加速开发的AI得力助手

文章目录 &#x1f4af;BLACKBOX.AI 官网&#x1f341;1 BLACKBOX.AI 工具使用教程&#x1f341;2 BLACKBOX.AI工具使用界面介绍&#x1f341;3 Chat(聊天)功能&#x1f341;4 Explore (探索)功能&#x1f48e;4.1 Terminal(终端)功能&#x1f48e;4.2 Discover(发现)功能&…

【Verilog HDL-1】基本、向量、模块

HDL习题 1 阻塞型赋值‘’与非阻塞型赋值‘<’ 阻塞型赋值 b a ba ba&#xff1a;适用于纯组合电路 非阻塞型赋值 b < a b<a b<a&#xff1a;适用与时序逻辑电路 2 wire线型,assign连续赋值 wire a,b,c; assign b a; assign c a;与编程语言不同&#xff…

普通集群与镜像集群配置

一. 环境准备 关闭防火墙和selinux&#xff0c;进行时间同步 rabbitmq-1 Rocky_linux9.4 192.168.226.22rabbitmq-2Rocky_linux9.4192.168.226.23rabbitmq-3Rocky_linux9.4192.168.226.24 修改主机名#192.168.226.22 hostnamectl set-hostname rabbitmq-1#192.168.226.22 ho…

【操作系统期末速成】 EP03 | 学习笔记(基于五道口一只鸭)

文章目录 一、前言&#x1f680;&#x1f680;&#x1f680;二、正文&#xff1a;☀️☀️☀️2.1 考点五&#xff1a;进程的概念及特征2.1 考点六&#xff1a;进程的状态与切换 一、前言&#x1f680;&#x1f680;&#x1f680; ☀️ 回报不在行动之后&#xff0c;回报在行动…

HIVE每日一题

select * from sku_info order by sku_id ; 为什么结果没有顺序排序。什么原因导致的&#xff1f;

75. UE5 RPG 创建场景摆放部件蓝图

这一篇文章来点简单的内容&#xff0c;相当于我们使用蓝图创建类似于unity的预制体。 创建一个一个柱子蓝图 首先&#xff0c;我们创建一个立柱的蓝图&#xff0c;将我们之前创建的柱子上面含有火焰和灯光的部分合并成一个蓝图&#xff0c;方便往场景内添加。 点击创建一个基…

【SpringBoot】SpringBoot核心启动流程源码解析

SpringBoot总体流程 当我们启动一个SpringBoot程序的时候&#xff0c;只需要一个main方法就可以启动&#xff0c;但是对于其中流程时如何执行的&#xff0c;以及如何调用spring的IOC和AOP机制&#xff0c;本篇带着这个问题来整体体系化的梳理下流程。 SpringBootApplication …

【语言模型】Xinference的部署过程

一、引言 Xinference&#xff0c;也称为Xorbits Inference&#xff0c;是一个性能强大且功能全面的分布式推理框架&#xff0c;专为各种模型的推理而设计。无论是研究者、开发者还是数据科学家&#xff0c;都可以通过Xinference轻松部署自己的模型或内置的前沿开源模型。Xinfe…