D356周赛复盘:滑动窗口+三元问题思路
文章目录
- 2798.满足目标工作时长的员工数目
- 完整版
- 2799.统计完全子数组的数目(滑动窗口)
- 思路
- 完整版
- 2800.包含三个字符的最短字符串(复用思路与三元问题思想)
- 思路
- 复用减少字符串长度的思路
- 为什么一次性操作两个字符串
- 完整版
- 进一步理解”三元问题一次只操作两个字符串“
- 复用逻辑
2798.满足目标工作时长的员工数目
公司里共有 n
名员工,按从 0
到 n - 1
编号。每个员工 i
已经在公司工作了 hours[i]
小时。
公司要求每位员工工作 至少 target
小时。
给你一个下标从 0 开始、长度为 n
的非负整数数组 hours
和一个非负整数 target
。
请你用整数表示并返回工作至少 target
小时的员工数。
示例 1:
输入:hours = [0,1,2,3,4], target = 2
输出:3
解释:公司要求每位员工工作至少 2 小时。
- 员工 0 工作 0 小时,不满足要求。
- 员工 1 工作 1 小时,不满足要求。
- 员工 2 工作 2 小时,满足要求。
- 员工 3 工作 3 小时,满足要求。
- 员工 4 工作 4 小时,满足要求。
共有 3 位满足要求的员工。
示例 2:
输入:hours = [5,1,4,2,2], target = 6
输出:0
解释:公司要求每位员工工作至少 6 小时。
共有 0 位满足要求的员工。
提示:
1 <= n == hours.length <= 50
0 <= hours[i], target <= 105
完整版
- 简单模拟题,计数即可
class Solution {
public:int numberOfEmployeesWhoMetTarget(vector<int>& hours, int target) {int count = 0;for(int i=0; i<hours.size(); i++) {if(hours[i] >= target)count++;}return count;}
};
2799.统计完全子数组的数目(滑动窗口)
给你一个由 正 整数组成的数组 nums
。
如果数组中的某个子数组满足下述条件,则称之为 完全子数组 :
- 子数组中 不同 元素的数目等于整个数组不同元素的数目。
返回数组中 完全子数组 的数目。
子数组 是数组中的一个连续非空序列。
示例 1:
输入:nums = [1,3,1,2,2]
输出:4
解释:完全子数组有:[1,3,1,2]、[1,3,1,2,2]、[3,1,2] 和 [3,1,2,2] 。
示例 2:
输入:nums = [5,5,5,5]
输出:10
解释:数组仅由整数 5 组成,所以任意子数组都满足完全子数组的条件。子数组的总数为 10 。
提示:
1 <= nums.length <= 1000
1 <= nums[i] <= 2000
思路
首先我们需要知道有多少种不同的元素,然后使用滑动窗口的方式,一直扩大右边界,直到窗口内的元素种类与原数组相同,此时缩小左边界,每次缩小左边界,都可以对答案进行累加,因为滑动窗口内的子数组都是满足条件的。
注意,我们为了统计所有满足条件的子数组个数,滑动窗口的left左移需要同时统计map里面元素的个数。
完整版
class Solution {
public:int countCompleteSubarrays(vector<int>& nums) {int n=nums.size();unordered_map<int,int>count;unordered_set<int>uniqueNums;//先得到所有元素的种类数目for(int num:nums){uniqueNums.insert(num);//uset插入元素只能用insert//count[num]++;count必须在窗口内部更新}int result=0;int left=0;for(int i=0;i<nums.size();i++){count[nums[i]]++;//nums[i]累积数目//元素种类相同,缩小左边界while(count.size()==uniqueNums.size()){result+=nums.size()-1-i+1;//包含所有的子数组情况count[nums[left]]--;if(count[nums[left]]==0){count.erase(nums[left]);}left++;}//右边界i++包含在for循环里面了}return result;}
};
2800.包含三个字符的最短字符串(复用思路与三元问题思想)
给你三个字符串 a
,b
和 c
, 你的任务是找到长度 最短 的字符串,且这三个字符串都是它的 子字符串 。
如果有多个这样的字符串,请你返回 字典序最小 的一个。
请你返回满足题目要求的字符串。
注意:
- 两个长度相同的字符串
a
和b
,如果在第一个不相同的字符处,a
的字母在字母表中比b
的字母 靠前 ,那么字符串a
比字符串b
字典序小 。 - 子字符串 是一个字符串中一段连续的字符序列。
示例 1:
输入:a = "abc", b = "bca", c = "aaa"
输出:"aaabca"
解释:字符串 "aaabca" 包含所有三个字符串:a = ans[2...4] ,b = ans[3..5] ,c = ans[0..2] 。结果字符串的长度至少为 6 ,且"aaabca" 是字典序最小的一个。
示例 2:
输入:a = "ab", b = "ba", c = "aba"
输出:"aba"
解释:字符串 "aba" 包含所有三个字符串:a = ans[0..1] ,b = ans[1..2] ,c = ans[0..2] 。由于 c 的长度为 3 ,结果字符串的长度至少为 3 。"aba" 是字典序最小的一个。
提示:
1 <= a.length, b.length, c.length <= 100
a
,b
,c
只包含小写英文字母。
思路
本题的思路是枚举abc三个字符串所有的拼接情况,一边枚举一边进行字母的”复用“
我们的目的是找到一个最短的字符串t
,它既包含了a
,也包含了b
。为了得到最短字符串,需要使用尽可能少的b
的字符。
复用减少字符串长度的思路
复用这一步的核心思想就是,如果a
和b
有重叠(也就是可以复用)的部分,那么这个重叠部分肯定出现在a
的末尾和b
的开头。因此,对于字符串b,我们可以选择倒着拼接,尝试找到这个b开头和a的重叠部分,以减少最终生成的字符串t
的长度。
如果我们正着拼接,即从b
的开头开始,那么这个重叠部分可能无法有效复用。例如,如果a
=“abc”,b
=“bcd”,那么正着拼接的结果可能是"abc"(不使用b
的任何字符),而实际上我们可以通过使用b
的一个字符得到更短的结果"abcd"。所以,我们选择从b
的末尾开始倒着拼接,检查倒着拼接从不使用b的任何字符,到使用b的所有字符这个范围内,能不能通过复用b开头和a末尾重叠的部分,来使得原字符串包含b。
为什么一次性操作两个字符串
为什么只能一次性合并两个字符串,而不是一口气把三个字符串全处理完?
这是因为我们需要处理的问题是一个三元问题(有三个字符串需要合并)。当我们一次处理两个字符串时,我们可以将问题简化为两个二元问题,这使得问题更容易处理。一次处理两个字符串,我们可以找到一个字符串,它包含了这两个字符串,然后我们再用这个字符串和第三个字符串进行合并,这样问题就被简化了。
可以在代码中进行进一步的理解。
完整版
class Solution {
public:string minimumString(string a, string b, string c) {// 创建一个 vector 来存储所有可能的字符串组合vector<string> combinations;// 生成所有可能的字符串组合combinations.push_back(combine(a, b, c));combinations.push_back(combine(a, c, b));combinations.push_back(combine(b, a, c));combinations.push_back(combine(b, c, a));combinations.push_back(combine(c, a, b));combinations.push_back(combine(c, b, a));// 对字符串组合进行排序,首先比较长度,如果长度相同,则按字典序排序sort(combinations.begin(), combinations.end(), [](string &s1, string &s2) {if (s1.size() == s2.size()) return s1 < s2;return s1.size() < s2.size();});// 返回最短的字符串组合return combinations.front();}// 生成一个既包含 a 又包含 b 的字符串,然后将这个字符串和 c 组合,生成一个既包含 a, b, c 的字符串string combine(string a, string b, string c) {return combine2(combine2(a, b), c);}// 生成一个既包含 a 又包含 b 的字符串string combine2(string a, string b) {// 从使用 b 的所有字符开始,逐步减少使用的字符数量for (int i = 0; i <= b.size(); ++i) {// 拼接 a 和 b 的后缀,生成一个新的字符串string t = a + b.substr(b.size() - i);// 如果这个新的字符串包含 b,则它一定也包含 a,所以返回这个字符串if (t.find(b) != string::npos) return t; }// 如果 a 和 b 完全不重叠,则返回 a 和 b 的拼接return ""; }
};
进一步理解”三元问题一次只操作两个字符串“
combine2
函数的作用是生成一个同时包含两个输入字符串a
和b
的最小字符串。combine
函数则是用于生成同时包含a
、b
和c
三个输入字符串的最小字符串。为了实现这个目标,我们需要两次调用combine2
函数,先将a
和b
合并,然后将合并结果与c
进行合并。为了避免代码冗余,我们将combine2
的功能单独作为一个函数实现。
如果将combine1和combine2两个函数合并,也就是一次性处理三个字符串,会导致代码重复。比如,需要写两次类似的循环来分别处理三个字符串的组合,这会使代码变得复杂且难以维护。另一方面,通过将combine2
函数单独实现,我们可以更清晰地表达出代码的逻辑,并使得代码更易于阅读和理解。
比如,如果真的要一次性处理三个字符串,我们只能这么写:
string combine(string a, string b, string c = "") {// 内部函数,用于合并两个字符串auto merge = [&](string s1, string s2) {for (int i = 0; i <= s2.size(); ++i) {string t = s1 + s2.substr(s2.size() - i);if (t.find(s2) != string::npos) return t; }return ""; };// 首先合并a和bstring ab = merge(a, b);// 如果c为空,直接返回abif (c == "") return ab;// 否则,继续合并ab和creturn merge(ab, c);
}
在这个版本中,使用了一个Lambda表达式来处理两个字符串的合并,然后根据 c
是否为空来判断是否需要进一步合并。但是这个版本的代码显然更复杂,因为我们需要在函数内部再定义一个函数,并且引入了一个新的条件判断。所以从代码的清晰性和可维护性角度来说,原始的设计(将 combine2
函数单独分出来)更好。
复用逻辑
复用部分的代码:
// 生成一个既包含 a 又包含 b 的字符串string combine2(string a, string b) {// 从使用 b 的所有字符开始,逐步减少使用的字符数量for (int i = 0; i <= b.size(); ++i) {// 拼接 a 和 b 的后缀,生成一个新的字符串string t = a + b.substr(b.size() - i);// 如果这个新的字符串包含 b,则它一定也包含 a,所以返回这个字符串// 如果 a 和 b 完全不重叠,则返回 a 和 b 的拼接if (t.find(b) != string::npos) return t; }//随意返回一个数值即可return ""; }
这段复用逻辑,实际上是在判断,从不包含b任何字符,到包含b所有字符这个范围内,b开头的元素能不能和a末尾的元素实现复用。一旦能够复用(在倒着拼接的新字符串t里出现了完整的b),那么就可以直接返回t。
例子:a=“abbc” b=“bb”,那么最开始string t = a + b.substr(b.size() - i);,也就是t=a+b.substr(2),实际上此时b.substr(2)是空的,也就是最开始是在判断a里面是不是本来就包含了b。
相关文章:
D356周赛复盘:滑动窗口+三元问题思路
文章目录 2798.满足目标工作时长的员工数目完整版 2799.统计完全子数组的数目(滑动窗口)思路完整版 2800.包含三个字符的最短字符串(复用思路与三元问题思想)思路复用减少字符串长度的思路为什么一次性操作两个字符串 完整版进一步…...

ETHERNET/IP 转ETHERCAT连接倍福和欧姆龙PLC的配置方法
ETHERNET/IP和ETHERCAT是两种不同的协议,它们在工业生产中都有广泛的应用。然而,由于协议不同,这两种设备之间无法通讯,这给工业生产带来了很大的麻烦。而捷米JM-EIP-ECAT网关应运而生,它能够连接到ETHERNET/IP总线和E…...

Git分布式版本控制工具和GitHub(一)--简介
一.Git概述 1.Git简介 【1】什么是Git? Git就是代码版本管理工具。 【2】为什么要使用Git (1)版本控制 写代码就是不断写BUG的过程(当然我们是不会这么说的),很多时候你写了100行代码之后,突然醒悟&…...

【Terraform学习】Terraform-AWS部署快速入门(快速入门)
Terraform-AWS部署快速入门 实验步骤 连接到 Terraform 环境 SSH 连接到Terraform 环境(名为MyEC2Instance的实例) 在 Amazon Web Services (AWS) 上预置 EC2 实例 用于描述 Terraform 中基础结构的文件集称为 Terraform 配置。您将编写一个配置来定义…...
力扣75——深度优先搜索
总结leetcode75中深度优先搜索的算法题解题思路。 上一篇:力扣75——链表 以下代码部分为本人所写,部分为官方示例代码。 力扣75——深度优先搜索 1 二叉树的最大深度2 叶子相似的树3 统计二叉树中好节点的数目4 路径总和 III5 二叉树中的最长交错路径6 …...

【C++初阶】C++基础(上)——C++关键字、命名空间、C++输入输出、缺省参数、函数重载
目录 1. C关键字 2. 命名空间 2.1 命名空间的定义 2.2 命名空间的使用 3. C输入&输出 4. 缺省参数 4.1 缺省参数概念 4.2 缺省参数分类 5. 函数重载 5.1 函数重载概念 5.2 C支持函数重载的原理——名字修饰(name Mingling) 5.3 extern &…...
代码随想录训练营Day55动态规划part15|392.判断子序列|115.不同的子序列
392.判断子序列 编辑距离问题目前能够很简单的做出来,注意两个细节 s为空,直接输出true在break时,j不会再,因此在break前要手动 Carl用了二维数组,dp[i][j] 由dp[i-1][j-1]1dp[i][j-1]递推 115.不同的子序列 dp[i][…...

Linux下安装RabbitMQ教程
官方安装指南:https://www.rabbitmq.com/install-rpm.html 我们将要安装的RabbitMQ的版本是3.8.2 el/7/rabbitmq-server-3.8.2-1.el7.noarch.rpm - rabbitmq/rabbitmq-server packagecloud 不需要单独安装Erlang环境。 2. 环境配置: 前提ÿ…...
如何加强Mysql安全,请给出可行的具体措施
如何加强Mysql安全,请给出可行的具体措施 数据库对于公司而言是一个非常重要的资产。它在数据存储和管理、业务应用支持、决策和分析、数据安全和合规性、业务连续性以及客户关系管理等方面都发挥着关键作用。因此,公司应该高度重视数据库的建设、管理和…...

创造自己的宠物医院预约服务小程序,步骤详解
在现代社会,越来越多的人开始养宠物,而宠物的健康管理也成为了一个重要的话题。为了方便宠物主人随时随地进行宠物医院的管理和服务,开发一个宠物医院管理小程序是很有必要的。今天我们将分享一些制作宠物医院管理小程序的技巧,帮…...

MACOM EDI 需求分析
MACOM 是一家全球性半导体公司,专注于设计和制造高性能射频、微波和光电元件,其产品被广泛应用于通信、航空航天、国防、工业和医疗等领域。随着 MACOM 的不断发展,传统数据传输方式效率较低,无法满足 MACOM 的需求。为了提高企业…...

使用Spring Boot AOP实现日志记录
目录 介绍 1.1 什么是AOP 1.2 AOP体系与概念 AOP简单实现 2.1 新建一个SpringBoot项目,无需选择依赖 2.2 设置好本地Maven配置后,在pom.xml文件里添加添加maven依赖 2.3 创建一个业务类接口 2.4 在实体类实现接口业务 2.5 在单元测试运行结果 …...
图像中不规则物体的长轴与短轴:OpenCV实现指南
1.首先,读取图像并将其转换为灰度图像。 2.进行图像预处理,包括使用高斯模糊和阈值化,以便更好地处理图像。 3.通过使用OpenCV的cv2.findContours()函数,找到图像中的所有轮廓。 4.遍历所有轮廓,如果轮廓点的数量大…...

C/C++开发,opencv与qt结合播放视频
目录 一、qt_ui创建 1.1 ui设置 1.2 ui及代码输出保存 二、创建工程 2.1 工程目录及编译设置 2.2 源码设计 三、编译及测试 3.1 程序编译 3.2 程序运行 首先声明,这是一个OpenCV 3学习文档的案例,但是说明有些过于省略,只有一些简短的代码…...
磁共振图像处理中 fft1c 和 ifft1c 函数的 Python 实现
fft1c 和 ifft1c 是 MRI 图像处理的常用函数。通常使用如下的 Matlab 实现 (Michael Lustig,2005) function res ifft1c(x,dim)% res fft1c(x) % % orthonormal forward 1D FFT %nsize(x,dim); shftzeros(1,5); shft(dim)ceil(n/2);xcirc…...
阿里云国际站香港地域服务器访问延迟丢包的原因及解决方法
阿里云百科有2台香港地域的轻量应用服务器,国内使用发现Ping值延迟丢包严重,从大陆到香港访问是经过国际链路和运营商国际路由节点,会受到到国际链路拥塞,以及运营商出境路由限制,导致无法正常连接或访问某些网站&…...
GULI PART.1
文章目录 1、尚硅谷-谷粒学院1.1、系统功能模块介绍1.2、系统开发方式 2、Mybatis-Plus2.1、什么是 MyBatis?2.2、什么是Mybatis-Plus?2.3、Mybatis-plus 的特性2.4、支持的数据库 3、Mybatis-Plus入门3.1、创建表和数据3.2、创建SpringBoot工程3.3、安装…...

NetApp FAS2750 和 FAS2820:适用于分布式企业和从远程到核心的 FAS
NetApp FAS2750 和 FAS2820:适用于分布式企业和从远程到核心的 FAS 拥有分布式企业和多个办公位置的客户希望使用这些系统进行虚拟化,以及为大型 FAS 和 AFF 系统提供简单且经济高效的备份和灾难恢复。 为什么要从 NetApp FAS 系列中选择一个型号&…...
剑指YOLOv8改进最新MPDIoU损失函数:超越现有多种G/D/C/EIoU,23年7月首发论文,高效准确的边界框回归的损失
💡本篇内容:剑指YOLOv8改进最新MPDIoU损失函数:超越现有多种G/D/C/EIoU,23年7月首发论文,高效准确的边界框回归的损失 💡🚀🚀🚀本博客 改进源代码改进 适用于 YOLOv8 按步骤操作运行改进后的代码即可 💡:重点:该专栏《剑指YOLOv8原创改进》只更新改进 YOLO…...

SQL-每日一题【1070. 产品销售分析 III】
题目 销售表 Sales: 产品表 Product: 编写一个 SQL 查询,选出每个销售产品 第一年 销售的 产品 id、年份、数量 和 价格。 结果表中的条目可以按 任意顺序 排列。 查询结果格式如下例所示: 示例 1: 解题思路 前置知…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...

ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...

STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...

Neko虚拟浏览器远程协作方案:Docker+内网穿透技术部署实践
前言:本文将向开发者介绍一款创新性协作工具——Neko虚拟浏览器。在数字化协作场景中,跨地域的团队常需面对实时共享屏幕、协同编辑文档等需求。通过本指南,你将掌握在Ubuntu系统中使用容器化技术部署该工具的具体方案,并结合内网…...