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]];
}

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

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

相关文章

智能充电桩,机器人 wifi蓝牙 解决方案

新联鑫威低功耗高性价比sdio wifi/蓝牙combo的模块单频2.4g的CYWL6208&#xff0c;双频2.4g/5g CYWL6312可以应用到一些低延时 高性能 低功耗 联网需求的交流直流充电桩&#xff0c;扭力扳手&#xff0c;agv机器人&#xff0c;目前支持主流的stm32F4/GD32F4 瑞萨 psoc的主控&am…

Shell脚本——循环语句(for、while和until循环)

一、命令 1.echo命令 echo -n 表示不换行输出 echo -e 输出转义字符&#xff0c;将转义后的内容输出到屏幕上 常见转义字符&#xff1a; \b 相当于退格键 转义后相当于退格键&#xff08;backspace&#xff09;&#xff0c;但是前提是“\b”存在字符。“\b”表示删除前一个…

Maven(上):Maven介绍、安装配置及工程构建

1. Maven介绍 Maven 是一款为 Java 项目管理构建、依赖管理的工具&#xff08;软件&#xff09;&#xff0c;使用 Maven 可以自动化构建、测试、打包和发布项目&#xff0c;大大提高了开发效率和质量。 Maven就是一个软件&#xff0c;掌握安装、配置、以及基本功能 &#xff…

二叉树的最大深度[简单]

优质博文&#xff1a;IT-BLOG-CN 一、题目 给定一个二叉树root&#xff0c;返回其最大深度。 二叉树的最大深度是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3 示例 2&#xff1a…

Java面试——基础篇

目录 1、java语言有哪些优点和缺点? 2、JVM 、 JDK 和 JRE的关系 3、为什么说 Java 语言“编译与解释并存”&#xff1f; 4、Java和c的区别 5、基本数据类型 5.1、java的8种基本数据类型&#xff1a; 5.2、基本类型和包装类型的区别&#xff1a; 5.3、包装类型的缓存机…

【大数据】YARN常用命令及Rest API

YARN 1.YARN常用命令 1.1 作业 命令说明yarn application -list列出所有的applicationyarn application -list -appStates [ALL、NEW、NEW_SAVING、SUBMITTED、ACCEPTED、RUNNING、FINISHED、FAILED、KILLED]根据application状态过滤yarn application -kill [applicationId]…

c# 解决ini中文乱码

乱码仅仅是因为编码规则导致 解码时对应文件的码制即可 public class IniConfig{private string inipath AppDomain.CurrentDomain.BaseDirectory "Config.ini";public bool CanRead(){if (File.Exists(inipath)){return true;}return false;}//声明API函数[DllImp…

大数据开发之Scala

第 1 章&#xff1a;scala入门 1.1 概述 scala将面向对象和函数式编程结合成一种简洁的高级语言 特点 1、scala和java一样属于jvm语言&#xff0c;使用时都需要先编译为class字节码文件&#xff0c;并且scala能够直接调用java的类库 2、scala支持两种编程范式面向对象和函数式…

小黑艰难的前端啃bug之路:内联元素之间的间隙问题

今天开始学习前端项目&#xff0c;遇到了一个Bug调了好久&#xff0c;即使margin为0&#xff0c;但还是有空格。 小黑整理&#xff0c;用四种方法解决了空白问题 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></tit…

应该如何选择轻量级低代码、重量级低代码、轻量级低代码+定制、纯定制软件开发?

引言 在当今数字化时代&#xff0c;软件开发成为推动业务创新和增强竞争力的关键因素。然而&#xff0c;在众多的软件开发方法中&#xff0c;如何选择适合自己项目的方法成为了一个至关重要的问题。本文将探讨轻量级低代码、重量级低代码、轻量级低代码定制、以及纯定制这四种…

[MQ]常用的mq产品图形管理web界面或客户端

一、MQ介绍 1.1 定义 MQ全称为Message Queue&#xff0c;消息队列是应用程序和应用程序之间的通信方法。 如果非要用一个定义来概括只能是抽象出来一些概念&#xff0c;概括为跨服务之间传递信息的软件。 1.2 MQ产品 较为成熟的MQ产品&#xff1a;IBMMQ&#xff08;IBM We…

目标检测 - RCNN系列模型

文章目录 1. RCNN2. Fast-RCNN3. Faster-RCNN 1. RCNN 论文&#xff1a;Rich feature hierarchies for accurate object detection and semantic segmentation 地址&#xff1a;https://arxiv.org/abs/1311.2524 分为两个阶段&#xff1a; 目标候选框Object ProposalsProposal…

算法------(10)堆

例题&#xff1a;&#xff08;1&#xff09;AcWing 838. 堆排序 我们可以利用一个一维数组来模拟堆。由于堆本质上是一个完全二叉树&#xff0c;他的每个父节点的权值都小于左右子节点&#xff0c;而每个父节点编号为n时&#xff0c;左节点编号为2*n&#xff0c;右节点编号为2*…

kubeSphere DevOps自定义容器 指定nodejs版本

✨✨✨✨✨✨ &#x1f380;前言&#x1f381;基于内置镜像构建&#x1f381;把镜像添加基础容器中&#x1f381;检查容器是否配置成功&#x1f381;不生效的原因排查&#x1f381;按步骤执行如下命令 &#x1f380;前言 由于我本地的开发环境node是16.18.1,而自带容器node的版…

VUE项目目录与运行流程(VScode)

各目录对应名称含义 main.js&#xff08;导入App.vue&#xff0c;基于App.vue创建结构渲染index.html&#xff09; //核心作用&#xff1a;导入App.vue&#xff0c;基于App.vue创建结构渲染index.html//1.导入Vue核心包 import Vue from vue//2.导入App.vue根组件 import App f…

MSB20M-ASEMI小功率家电专用MSB20M

编辑&#xff1a;ll MSB20M-ASEMI小功率家电专用MSB20M 型号&#xff1a;MSB20M 品牌&#xff1a;ASEMI 封装&#xff1a;UMSB-4 最大重复峰值反向电压&#xff1a;1000V 最大正向平均整流电流(Vdss)&#xff1a;2A 功率(Pd)&#xff1a;50W 芯片个数&#xff1a;4 引…

20240122面试练习题10

1. Redis为什么执行这么快&#xff1f; 二、Redis为什么这么快&#xff1f; 1、完全基于内存&#xff0c;数据存在内存中&#xff0c;绝大部分请求是纯粹的内存操作&#xff0c;非常快速&#xff0c;跟传统的磁盘文件数据存储相比&#xff0c;避免了通过磁盘IO读取到内存这部分…

微软 AD |域控制器 | 组件 | 域服务 | 对象解析

介绍 Active Directory&#xff08;AD&#xff09;&#xff0c;是微软的目录服务&#xff0c;提供强大的功能和管理体系&#xff0c;用于组织管理和安全存储网络上的资源和用户、计算机、服务对象等信息。 AD 功能&#xff1a; 身份验证和访问控制&#xff1a; 提供集中式的身…

Kubernets Deployment详解

因为Pod生命周期是短暂的&#xff0c;一旦运行完成则立即回收&#xff0c;且涉及Pod的创建、自愈、删除等操作比较复杂&#xff0c;所以很少在Kubernetes中直接使用Pod。而是使用更高级的称为Controller&#xff08;控制器&#xff09;的抽象层&#xff0c;来完成对Pod的创建、…

为什么时序逻辑电路会落后一拍?

1、时序逻辑电路落后一拍&#xff1f; FPGA初学者可能经常听到一句话&#xff1a;“时序逻辑电路&#xff0c;或者说用 < 输出的电路会延迟&#xff08;落后&#xff09;一个时钟周期。”但在仿真过程中经常会发现不符合这一“定律”的现象–明明是在仿真时序逻辑&#xff…