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 <= 500 <= 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 <= 10001 <= 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 <= 100a,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: 解题思路 前置知…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...
Qemu arm操作系统开发环境
使用qemu虚拟arm硬件比较合适。 步骤如下: 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载,下载地址:https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...
tomcat入门
1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效,稳定,易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...
