当前位置: 首页 > news >正文

D356周赛复盘:滑动窗口+三元问题思路

文章目录

    • 2798.满足目标工作时长的员工数目
      • 完整版
    • 2799.统计完全子数组的数目(滑动窗口)
      • 思路
      • 完整版
    • 2800.包含三个字符的最短字符串(复用思路与三元问题思想)
      • 思路
        • 复用减少字符串长度的思路
        • 为什么一次性操作两个字符串
      • 完整版
        • 进一步理解”三元问题一次只操作两个字符串“
        • 复用逻辑

2798.满足目标工作时长的员工数目

公司里共有 n 名员工,按从 0n - 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.包含三个字符的最短字符串(复用思路与三元问题思想)

给你三个字符串 abc , 你的任务是找到长度 最短 的字符串,且这三个字符串都是它的 子字符串

如果有多个这样的字符串,请你返回 字典序最小 的一个。

请你返回满足题目要求的字符串。

注意:

  • 两个长度相同的字符串 ab ,如果在第一个不相同的字符处,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
  • abc 只包含小写英文字母。

思路

本题的思路是枚举abc三个字符串所有的拼接情况,一边枚举一边进行字母的”复用

我们的目的是找到一个最短的字符串t,它既包含了a,也包含了b。为了得到最短字符串,需要使用尽可能少的b的字符

复用减少字符串长度的思路

复用这一步的核心思想就是,如果ab有重叠(也就是可以复用)的部分,那么这个重叠部分肯定出现在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函数的作用是生成一个同时包含两个输入字符串ab的最小字符串combine函数则是用于生成同时包含abc三个输入字符串的最小字符串。为了实现这个目标,我们需要两次调用combine2函数,先将ab合并,然后将合并结果与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.统计完全子数组的数目&#xff08;滑动窗口&#xff09;思路完整版 2800.包含三个字符的最短字符串&#xff08;复用思路与三元问题思想&#xff09;思路复用减少字符串长度的思路为什么一次性操作两个字符串 完整版进一步…...

ETHERNET/IP 转ETHERCAT连接倍福和欧姆龙PLC的配置方法

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

Git分布式版本控制工具和GitHub(一)--简介

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

【Terraform学习】Terraform-AWS部署快速入门(快速入门)

Terraform-AWS部署快速入门 实验步骤 连接到 Terraform 环境 SSH 连接到Terraform 环境(名为MyEC2Instance的实例) 在 Amazon Web Services &#xff08;AWS&#xff09; 上预置 EC2 实例 用于描述 Terraform 中基础结构的文件集称为 Terraform 配置。您将编写一个配置来定义…...

力扣75——深度优先搜索

总结leetcode75中深度优先搜索的算法题解题思路。 上一篇&#xff1a;力扣75——链表 以下代码部分为本人所写&#xff0c;部分为官方示例代码。 力扣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支持函数重载的原理——名字修饰&#xff08;name Mingling&#xff09; 5.3 extern &…...

代码随想录训练营Day55动态规划part15|392.判断子序列|115.不同的子序列

392.判断子序列 编辑距离问题目前能够很简单的做出来&#xff0c;注意两个细节 s为空&#xff0c;直接输出true在break时&#xff0c;j不会再&#xff0c;因此在break前要手动 Carl用了二维数组&#xff0c;dp[i][j] 由dp[i-1][j-1]1dp[i][j-1]递推 115.不同的子序列 dp[i][…...

Linux下安装RabbitMQ教程

官方安装指南&#xff1a;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. 环境配置&#xff1a; 前提&#xff…...

如何加强Mysql安全,请给出可行的具体措施

如何加强Mysql安全&#xff0c;请给出可行的具体措施 数据库对于公司而言是一个非常重要的资产。它在数据存储和管理、业务应用支持、决策和分析、数据安全和合规性、业务连续性以及客户关系管理等方面都发挥着关键作用。因此&#xff0c;公司应该高度重视数据库的建设、管理和…...

创造自己的宠物医院预约服务小程序,步骤详解

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

MACOM EDI 需求分析

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

使用Spring Boot AOP实现日志记录

目录 介绍 1.1 什么是AOP 1.2 AOP体系与概念 AOP简单实现 2.1 新建一个SpringBoot项目&#xff0c;无需选择依赖 2.2 设置好本地Maven配置后&#xff0c;在pom.xml文件里添加添加maven依赖 2.3 创建一个业务类接口 2.4 在实体类实现接口业务 2.5 在单元测试运行结果 …...

图像中不规则物体的长轴与短轴:OpenCV实现指南

1.首先&#xff0c;读取图像并将其转换为灰度图像。 2.进行图像预处理&#xff0c;包括使用高斯模糊和阈值化&#xff0c;以便更好地处理图像。 3.通过使用OpenCV的cv2.findContours()函数&#xff0c;找到图像中的所有轮廓。 4.遍历所有轮廓&#xff0c;如果轮廓点的数量大…...

C/C++开发,opencv与qt结合播放视频

目录 一、qt_ui创建 1.1 ui设置 1.2 ui及代码输出保存 二、创建工程 2.1 工程目录及编译设置 2.2 源码设计 三、编译及测试 3.1 程序编译 3.2 程序运行 首先声明&#xff0c;这是一个OpenCV 3学习文档的案例&#xff0c;但是说明有些过于省略&#xff0c;只有一些简短的代码…...

磁共振图像处理中 fft1c 和 ifft1c 函数的 Python 实现

fft1c 和 ifft1c 是 MRI 图像处理的常用函数。通常使用如下的 Matlab 实现 &#xff08;Michael Lustig&#xff0c;2005&#xff09; 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台香港地域的轻量应用服务器&#xff0c;国内使用发现Ping值延迟丢包严重&#xff0c;从大陆到香港访问是经过国际链路和运营商国际路由节点&#xff0c;会受到到国际链路拥塞&#xff0c;以及运营商出境路由限制&#xff0c;导致无法正常连接或访问某些网站&…...

GULI PART.1

文章目录 1、尚硅谷-谷粒学院1.1、系统功能模块介绍1.2、系统开发方式 2、Mybatis-Plus2.1、什么是 MyBatis&#xff1f;2.2、什么是Mybatis-Plus&#xff1f;2.3、Mybatis-plus 的特性2.4、支持的数据库 3、Mybatis-Plus入门3.1、创建表和数据3.2、创建SpringBoot工程3.3、安装…...

NetApp FAS2750 和 FAS2820:适用于分布式企业和从远程到核心的 FAS

NetApp FAS2750 和 FAS2820&#xff1a;适用于分布式企业和从远程到核心的 FAS 拥有分布式企业和多个办公位置的客户希望使用这些系统进行虚拟化&#xff0c;以及为大型 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&#xff1a; 产品表 Product&#xff1a; 编写一个 SQL 查询&#xff0c;选出每个销售产品 第一年 销售的 产品 id、年份、数量 和 价格。 结果表中的条目可以按 任意顺序 排列。 查询结果格式如下例所示&#xff1a; 示例 1&#xff1a; 解题思路 前置知…...

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...