LeetCode 热题 100 | 子串

目录

1  560. 和为 K 的子数组

2  239. 滑动窗口最大值

3  76. 最小覆盖子串


菜鸟做题第二周,语言是 C++

1  560. 和为 K 的子数组

题眼:“子数组是数组中元素的连续非空序列。”

解决本问题的关键就在于如何翻译问题。子数组 s 的和可以看作数组 i 的和减去数组 j 的和,这样就把 “求子数组的和” 转换为了 “前缀和之间的差”。如下图所示:

解题思路:

  1. 遍历数组,计算所有前缀和 sum(i),并存入哈希表中
  2. 同时查看哈希表中是否存在前缀和 sum(j) 等于 sum(i) - k
class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        unordered_map<int, int> hash;

        int pre = 0, ans = 0;
        for (auto num:nums) {
            pre += num;
            if (pre == k) ++ans;
            if (hash.find(pre - k) != hash.end()) {
                ans += hash[pre - k];
            }
            ++hash[pre];
        }
        return ans;
    }
};

说明:这句代码是为了避免遗漏本身前缀和就等于 k 的情况

if (pre == k) ++ans;

官方题解一开始就给哈希表插入了 (0, 1),应该就是为了解决这个问题,但我没有照做。

2  239. 滑动窗口最大值

主要看你会不会优先队列。。。

解题思路:

  1. 初始化:插入前 k 个数字,队列头就是最大值
  2. 一格一格地右移窗口,并弹出队列头
  3. 若队列头的下标处在窗口内,则它就是窗口内的最大值
  4. 若队列头的下标处在窗口外,则继续弹出,直到处在窗口内
class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        int n = nums.size();
        priority_queue<pair<int, int>> q;

        for (int i = 0; i < k; ++i) {
            q.emplace(nums[i], i);
        }

        vector<int> ans = {q.top().first};
        for (int i = k; i < n; ++i) {
            q.emplace(nums[i], i);
            while (q.top().second <= i - k) {
                q.pop();
            }
            ans.push_back(q.top().first);
        }

        return ans;
    }
};

3  76. 最小覆盖子串

读懂题意很重要。。。

题目只要求当前窗口内的字母能够拼出字符串 t 即可,没有要求字母数量要一致。因此,判断能否覆盖的方法如下:

bool succeed() {
    for (auto t:tCount) {
        if (sCount[t.first] < t.second) {
            return false;
        }
    }
    return true;
}

其中,tCount 和 sCount 均为哈希表。tCount 记录的是 t 的字母数量,sCount 记录的是 s 的字母数量。这里只要求 sCount 中相应字母的数量比 t 的多即可,而不一定要相等。

解题思路:

  1. 首先移动右指针 right 使得窗口能够覆盖子串
  2. 然后移动左指针 left 直到窗口刚好不能覆盖子串
  3. 再移动右指针 right 使得窗口能够覆盖子串
  4. 循环往复(期间要维护最小长度和起始位置)

思路说明图:

可以类比为一只爬行的毛毛虫。首先,毛毛虫伸头,使得窗口能够覆盖子串 “ABC”;然后,毛毛虫收尾,使得窗口刚好不能覆盖子串 “ABC”;毛毛虫再伸头,使得窗口能够再次覆盖子串 “ABC”;以此类推。

class Solution {
public:
    unordered_map<char, int> sCount, tCount;

    bool succeed() {
        for (auto t:tCount) {
            if (sCount[t.first] < t.second) {
                return false;
            }
        }
        return true;
    }

    string minWindow(string s, string t) {
        int sLen = s.size(), tLen = t.size();
        int minStart = 0, minLen = sLen;
        string ans;
        int flag = 0;

        if (sLen < tLen) return "";

        for (int i = 0; i < tLen; ++i) {
            ++tCount[t[i]];
        }

        int left = 0, right = 0;
        while (right < sLen) {
            // 毛毛虫伸头
            if (tCount.find(s[right]) != tCount.end()) {
                ++sCount[s[right]];
            }
            ++right;

            // 毛毛虫收尾
            while (succeed()) {
                flag = 1;
                if (tCount.find(s[left]) != tCount.end()) {
                    --sCount[s[left]];
                }
                if (minLen > right - left) {
                    minLen = right - left;
                    minStart = left;
                }
                ++left;
            }
        }

        // 处理结果
        if (flag) {
            for (int i = minStart; i < minStart + minLen; ++i) {
                ans.push_back(s[i]);
            }
        }

        return ans;
    }
};

说明:每次做如下判断是因为我们只关心子串中含有的字母的个数

if (tCount.find(s[right]) != tCount.end()) {
    ++sCount[s[right]];
}

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

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

相关文章

精品基于Uniapp+ssm基于java的赈灾系统App救灾救助捐赠

《[含文档PPT源码等]精品基于Uniappssm基于java的赈灾系统App》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; 开发语言&#xff1a;Java 后台框架&#xff1a;ssm 安卓框架&#xff…

防御第三次作业-防火墙组网实验(3)

目录 实验拓扑图 要求 1 2 针对10.0.2.10设备的安全策略&#xff1a; 针对10.0.2.20设备的安全策略&#xff1a; 3 4 实验拓扑图 各设备ip和接口已配好&#xff0c;均可可ping通防火墙。 要求 1.生产区在工作时间内可以访问dmz区域&#xff0c;仅可以访问http服…

通俗易懂理解FCN全卷积网络模型

温故而知新&#xff0c;可以为师矣&#xff01; 一、参考资料 深度学习笔记&#xff08;二十三&#xff09;Semantic Segmentation(FCN/U-Net/PSPNet/SegNet/U-Net/ICNet/DFANet/Fast-SCNN) 二、FCN相关介绍 1. FCN简介 FCN&#xff08;Fully Convolutional Networks&…

ELK之Grafana添加钉钉告警信息

Grafana版本如下&#xff1a; [roottest data]# grafana-server -v Version 8.4.6 (commit: c53173ff6, branch: HEAD)一、新建钉钉群&#xff0c;并自定义一个机器人 点击右上角设置 ------》 智能群助手 ------》 添加机器人 ------》右侧设置按钮 ------》点击自定义&…

如何快速搭建springboot+前后端分离(vue),多商户客户端实现微信小程序+ios+app使用uniapp(一处编写,处处编译)

kxmalls外卖生鲜多商户&#xff0c;针对中小商户、企业和个人学习者开发。使用Java编码&#xff0c;采用SpringBoot、Mybatis-Plus等易用框架&#xff0c;适合个人学习研究。同时支持单机部署、集群部署&#xff0c;用户与店铺范围动态定位&#xff0c;中小商户企业可根据业务动…

【数据结构与算法】之字符串系列-20240126

这里写目录标题 一、12. 整数转罗马数字二、43. 字符串相乘三、49. 字母异位词分组四、151. 反转字符串中的单词五、179. 最大数 一、12. 整数转罗马数字 中等 罗马数字包含以下七种字符&#xff1a; I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D …

06.Elasticsearch应用(六)

Elasticsearch应用&#xff08;六&#xff09; 1.什么是分词器 ES文档的数据拆分成一个个有完整含义的关键词&#xff0c;并将关键词与文档对应&#xff0c;这样就可以通过关键词查询文档。要想正确的分词&#xff0c;需要选择合适的分词器 2.ES中的默认分词器 fingerprint…

OpenCV笔记之图像处理中遮罩和掩模的关系

OpenCV笔记之图像处理中遮罩和掩模的关系 code review 文章目录 OpenCV笔记之图像处理中遮罩和掩模的关系1.遮罩详解遮罩的创建遮罩的应用遮罩的主要应用遮罩的类型如何创建遮罩遮罩在图像处理中的应用方式 2.遮罩和掩模的关系 1.遮罩详解 在图像处理中&#xff0c;遮罩&#…

Linux笔记之bash脚本中的-e、和

Linux笔记之bash脚本中的-e、&和&& code review! 文章目录 Linux笔记之bash脚本中的-e、&和&&1.&和&&2.-e 1.&和&& 在Linux bash脚本中&#xff0c;&符号有几个不同的用途&#xff0c;这里列举了一些常见的情况&#xf…

文件IO讲解

&#x1f495;"跑起来就有意义"&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;文件IO讲解 一.与文件相关的基本概念 1.什么是文件 文件从广义上来说就是操作系统对其所持有的硬件设备和软件资源的抽象化表示,但是在日常生活中我们所提到的文件就…

三、Kotlin 类型初步

1. 类 & 接口 1.1 类的定义 1.1.1 空类的定义 Java 的定义&#xff1a; public class Foo {}Kotlin 的定义&#xff1a; class Foo注意&#xff1a; 类的访问权限修饰符默认为 public。 若类的 {} 为空&#xff0c;可以省略不写。 1.1.2 带成员的类的定义 Java 中定…

普通人如何打造自己人生的护城河?

哈喽&#xff0c;大家好啊&#xff0c;我是雷工。 今天在看《张一鸣管理日志》时看到这么一句话&#xff1a; 今日头条不断吸引更优秀的工程师&#xff0c;不断更新算法&#xff0c;才有了当前今日头条的算法护城河。 头条的算法有多牛&#xff0c;看你周边就知道了。 越来越多…

《剑指 Offer》专项突破版 - 面试题 28 : 展平多级双向链表(C++ 实现)

题目连接&#xff1a;LCR 028. 扁平化多级双向链表 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 在一个多级双向链表中&#xff0c;节点除了有两个指针分别指向前后两个节点&#xff0c;还有一个指针指向它的子链表&#xff0c;并且子链表也是一个双向链表&…

CentOS7自动备份数据库到git

虽然数据库没什么数据&#xff0c;但是有就是珍贵的啦&#xff0c;为了服务器什么的无了&#xff0c;所以还是要自动备份一下比较好。 Open备忘第一页 步骤 在Gitee&#xff08;github&#xff09;上创建一个私有仓库Gitee&#xff08;github&#xff09;配置好服务器的ssh在服…

获取双异步返回值时,如何保证主线程不阻塞?

目录 一、前情提要二、JDK8的CompletableFuture1、ForkJoinPool2、从ForkJoinPool和ThreadPoolExecutor探索CompletableFuture和Future的区别 三、通过CompletableFuture优化 “通过Future获取异步返回值”1、通过Future获取异步返回值关键代码&#xff08;1&#xff09;将异步…

k8s的图形化工具--rancher

什么是rancher&#xff1f; rancher是一个开源的企业级多集群的k8s管理平台 rancher和k8s的区别 都是为了容器的调度和编排系统&#xff0c;但是rancher不仅能够调度&#xff0c;还能管理k8s集群&#xff0c;自带监控&#xff08;普罗米修斯&#xff09; 实验部署 实验架构…

大语言模型推理提速:TensorRT-LLM 高性能推理实践

作者&#xff1a;顾静 TensorRT-LLM 如何提升 LLM 模型推理效率 大型语言模型&#xff08;Large language models,LLM&#xff09;是基于大量数据进行预训练的超大型深度学习模型。底层转换器是一组神经网络&#xff0c;这些神经网络由具有 self-attention 的编码器和解码器组…

基于Java+SpringMvc+vue+element实现上海汽车博物馆平台

基于JavaSpringMvcvueelement实现上海汽车博物馆平台 &#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承接各种定制系统 …

《Visual Tree Convolutional Neural Network in Image Classification》阅读笔记

论文标题 《Visual Tree Convolutional Neural Network in Image Classification》 图像分类中的视觉树卷积神经网络 作者 Yuntao Liu、Yong Dou、Ruochun Jin 和 Peng Qiao 来自国防科技大学并行和分布式处理国家实验室 初读 摘要 问题&#xff1a; 在图像分类领域&…

JCL中常用的DD语句

JCL中的DD语句介绍 ​ DD语句&#xff0c;主要定义数据集用的&#xff0c;也叫做DATASET DEFINE&#xff0c;分为定义设备的UNIT、VOLUME、SPACE&#xff0c;定义数据集的DSN、DISP、DCB,详细可以看英文版的《MVS JCL Reference》&#xff0c;还有一些特殊的DD&#xff0c;暂时…