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

【LeetCode周赛】第 390 场周赛

目录

  • 3090. 每个字符最多出现两次的最长子字符串 简单
  • 3091. 执行操作使数据元素之和大于等于 K 中等
  • 3092. 最高频率的 ID 中等
  • 3093. 最长公共后缀查询 困难

3090. 每个字符最多出现两次的最长子字符串 简单

3090. 每个字符最多出现两次的最长子字符串

分析:
数据量,按照题意模拟即可。
这里我是用了 前缀和 记录了 0~i 的所有字母出现的次数。

代码:

C++

class Solution {
public:int maximumLengthSubstring(string s) {int n=s.length();vector<vector<int>> cnt(n+1,vector<int>(26,0));for(int i=0;i<n;i++){cnt[i+1][s[i]-'a']++;for(int j=0;j<26;j++) cnt[i+1][j]+=cnt[i][j];}for(int i=n;i>1;i--){for(int j=0;j+i<=n;j++){int k=0;for(;k<26;k++){if(cnt[j+i][k]-cnt[j][k]>2) break;}if(k==26) return i;}}return 1;}
};

python

class Solution:def maximumLengthSubstring(self, s: str) -> int:cnt = [[0] * 216 for i in range(len(s)+1)]for i in range(len(s)):cnt[i+1][ord(s[i]) - ord('a')]+=1for j in range(26):cnt[i+1][j] += cnt[i][j]for i in range(len(s),1,-1):for j in range(0,len(s)-i+1):flag = Truefor k in range(26):if cnt[i+j][k] - cnt[j][k]>2:flag=Falsebreakif flag:return ireturn 1


3091. 执行操作使数据元素之和大于等于 K 中等

3091. 执行操作使数据元素之和大于等于 K

分析:

法一
贪心+找规律
在固定的操作次数 l l l 下,先进行 ⌊ l / 2 ⌋ \lfloor l/2 \rfloor l/2 次操作一,再进行 l − ⌊ l / 2 ⌋ l - \lfloor l/2 \rfloor ll/2 操作二,即可得到最大的元素之和。
规律如下:

操作次数 l最大元素之和
1 1 1 1 ∗ 2 = 2 1 * 2 = 2 12=2
2 2 2 2 ∗ 2 = 4 2 * 2 = 4 22=4
3 3 3 2 ∗ 3 = 6 2 * 3 = 6 23=6
4 4 4 3 ∗ 3 = 9 3 * 3 = 9 33=9
5 5 5 3 ∗ 4 = 12 3 * 4 = 12 34=12
6 6 6 4 ∗ 4 = 16 4 * 4 = 16 44=16

最终依照此规律,寻找最小的大于 k 的操作次数。

法二
贪心+枚举
先加,后复制得到的数更大。
最多进行 k-1 次加法,此时是操作次数最大的情况,枚举 1~k-1 次加法,再计算后续还需要多少次复制,维护最小操作数即可。

代码:

法一
C++

class Solution {
public:int minOperations(int k) {if(k==0||k==1) return 0;int cnt=1,a=1,b=2;while(a*b<k){if(a<b) a++;else b++;cnt++;}return cnt;}
};

python

class Solution:def minOperations(self, k: int) -> int:if k==1 or k==0:return 0cnt,a,b=1,1,2while a*b<k:if a<b:a+=1else:b+=1cnt+=1return cnt

法二:法二

3092. 最高频率的 ID 中等

3092. 最高频率的 ID

分析:
寻找每次操作后,出现频率最高的数即可。
题目难点在于,在每次操作之后怎么寻找当前出现频率最高的数。

  • 遍历的话,数据量大一定超时。
  • 利用语言自带的工具
    • 哈希表 + 可重复的有序集合:c++中的 multiset ,python中的 SortedList
    • 哈希表 + 优先队列 + 懒删除堆

懒删除堆:因为优先队列不能查找,因此对于并非队首或队尾的元素,我们无法操作。可以使用 哈希表 维护当前的ID出现的次数,并将修改后的ID即其出现次数放入优先队列。同时对比优先队列队首的ID出现次数,与当前不符,就弹出。

代码:

哈希表 + 可重复的有序集合
C++

class Solution {
public:vector<long long> mostFrequentIDs(vector<int>& nums, vector<int>& freq) {unordered_map<int ,long long> m;multiset<long long> s;vector<long long> ans;m[nums[0]]+=1LL*freq[0];s.emplace(1LL*freq[0]);ans.push_back(1LL*freq[0]);for(int i=1;i<nums.size();i++){long long t = m[nums[i]];m[nums[i]]+=1LL*freq[i];auto it = s.find(t);if(it != s.end()){s.erase(it); // 删除集合中的一个 t}s.insert(m[nums[i]]);ans.push_back(*s.rbegin()); // 有序集合,s.rbegin() 即为最大的出现次数}return ans;}
};

python

from sortedcontainers import SortedList
class Solution:def mostFrequentIDs(self, nums: List[int], freq: List[int]) -> List[int]:cnt = Counter()s = SortedList()ans = []for x,f in zip(nums, freq):t = cnt[x]s.discard(t)cnt[x]+=fs.add(cnt[x])ans.append(s[-1])return ans

哈希表 + 优先队列 + 懒删除堆
C++

class Solution {
public:vector<long long> mostFrequentIDs(vector<int>& nums, vector<int>& freq) {unordered_map<int ,long long> m;priority_queue<pair<long long, int>> q;vector<long long> ans;m[nums[0]]+=1LL*freq[0];q.emplace(m[nums[0]], nums[0]);ans.push_back(1LL*freq[0]);for(int i=1;i<nums.size();i++){long long t = m[nums[i]];m[nums[i]]+=1LL*freq[i];q.emplace(m[nums[i]], nums[i]); // 不断的将修改后的 ID 及其 对应的出现次数 加入优先队列// 如下循环 实现 懒删除堆while(m[q.top().second] != q.top().first) q.pop(); // 与当前 ID 的出现次数不符合,弹出优先队列ans.push_back(q.top().first);}return ans;}
};

python

class Solution:def mostFrequentIDs(self, nums: List[int], freq: List[int]) -> List[int]:cnt = Counter()h = []ans = []for x,f in zip(nums, freq):cnt[x]+=fheapq.heappush(h, (-cnt[x], x))while -h[0][0] != cnt[h[0][1]]:heapq.heappop(h)ans.append(-h[0][0])return ans


3093. 最长公共后缀查询 困难

3093. 最长公共后缀查询

分析:
构建基于字符串后缀的字典树,并且不断维护对应下标,后续不断在字典树上查找即可。
注意数组的使用,容易内存超限。
同时注意当没有后缀与其匹配是,需要填入最短字符串的下标、

构建字典树模板:CPP
构建字典树模板:Python

代码:

C++

class Node{
public:int index=-1;Node* next[26]{};
};class Solution {
public:vector<int> stringIndices(vector<string>& wordsContainer, vector<string>& wordsQuery) {int n=wordsContainer.size(),m=wordsQuery.size(),d=1e4+5,dindex=-1;vector<int> ans;Node* root = new Node();for(int i=0;i<n;i++){int l=wordsContainer[i].length();if(d>l) d=l,dindex=i;Node* node = root;for(int j=l-1;j>=0;j--){int k = wordsContainer[i][j]-'a';if(!node->next[k]) node->next[k] = new Node();node = node->next[k];if(node->index==-1) node->index=i;else{if(wordsContainer[node->index].length()>l) node->index=i;}}}for(int i=0;i<m;i++){Node* node = root;int l=wordsQuery[i].length();int index=-1;for(int j=l-1;j>=0;j--){int k = wordsQuery[i][j]-'a';if(!node->next[k])break;node=node->next[k];index=node->index;}ans.push_back(index!=-1?index:dindex);}return ans;}
};

python

class Node:def __init__(self) -> None:self.children = [None] * 26self.index = -1class Solution:def stringIndices(self, wordsContainer: List[str], wordsQuery: List[str]) -> List[int]:n,m = len(wordsContainer), len(wordsQuery)d,d_index = len(wordsContainer[0]),0ans = []def build_trie() -> Node: # 构建字典树nonlocal wordsContainer,d,d_indexroot = Node()for i in range(n):l=len(wordsContainer[i])if d>l:d=ld_index=inode = rootfor j in range(l-1, -1, -1):k = ord(wordsContainer[i][j]) - ord('a') # 字母转换成下标if node.children[k] == None:node.children[k] = Node()node = node.children[k]if node.index == -1: # 更新更优下标node.index = ielse:node.index = i if len(wordsContainer[node.index]) > l else node.indexreturn rootroot = build_trie()def find_word(s: str):nonlocal rootnode = rootindex = -1for i in range(len(s)-1,-1,-1):k = ord(s[i]) - ord('a')if node.children[k]==None:breaknode = node.children[k]index = node.indexreturn indexfor i in range(m):t = find_word(wordsQuery[i])ans.append(t if t!=-1 else d_index)return ans

相关文章:

【LeetCode周赛】第 390 场周赛

目录 3090. 每个字符最多出现两次的最长子字符串 简单3091. 执行操作使数据元素之和大于等于 K 中等3092. 最高频率的 ID 中等3093. 最长公共后缀查询 困难 3090. 每个字符最多出现两次的最长子字符串 简单 3090. 每个字符最多出现两次的最长子字符串 分析&#xff1a; 数据量…...

leetcode 343.整数拆分

思路&#xff1a;记忆化搜索或者动态规划 我们首先捋一下思路&#xff0c;而且分析最优解这一类问题&#xff0c;我们需要几个步骤&#xff1a; 1.看问题的描述&#xff0c;找出问题问的最优问题是什么&#xff1b; 2.然后我们就模拟一下这个问题进行到最后一步是什么样子&a…...

部署Zabbix Agents添加使能监测服务器_Linux平台_Yum源/Archive多模式

Linux平台 一、从yum源脚本安装部署Zabbix-Agent,添加Linux Servers/PC 概述 Zabbix 主要有以下几个组件组成: Zabbix Server:Zabbix 服务端,Zabbix的核心组件,它负责接收监控数据并触发告警,还负责将监控数据持久化到数据库中。 Zabbix Agent:Zabbix客户端,部署在被监…...

吴恩达2022机器学习专项课程(一) 第一周课程实验:模型表示(Lab_03)

目标 学习如何使用一个变量实现线性回归模型。 导入需要的库 存储特征x和目标变量y 这是真实的训练集&#xff0c;[1.0,2.0]是房子的大小&#xff0c;[300,500]是房子的价格。 使用数组存储训练集的数据&#xff1a; x_train&#xff1a;存储的是所有特征&#xff0c;[1.…...

流畅的 Python 第二版(GPT 重译)(十)

第十八章&#xff1a;with、match 和 else 块 上下文管理器可能几乎与子例程本身一样重要。我们只是初步了解了它们。[…] Basic 有一个 with 语句&#xff0c;在许多语言中都有 with 语句。但它们的功能不同&#xff0c;它们都只是做一些非常浅显的事情&#xff0c;它们可以避…...

【自然语言处理七-经典论文-attention is all you need】

然语言处理七-经典论文-attention is all you need 摘要原文译文小结 1&#xff1a;引言原文译文小结 2&#xff1a;背景原文译文小结 3&#xff1a;模型架构原文译文小结 3.1 编码器和解码器原文译文小结 3.2 注意力原文译文小结3.2.1 缩放点积注意力原文总结 3.2.2 多头注意力…...

【嵌入式】STM32和I2C通信

一、简介 I2C(Inter IC Bus)是有飞利浦公司开发的一种通用数据总线&#xff0c;主要通过两个通信线SCL和SDA进行通信&#xff0c;其中SCL(Serial Clock)是时钟线&#xff0c;用于收发双方同步数据&#xff0c;SDA(Serial Data)是数据线&#xff0c;用于传输数据。是一种同步半…...

如何使用Harmony OS控制外设——输入输出?

相关知识点 Hi3861开发板第一个示例程序演示 熟悉使用DevEco Device Tool插件进行程序烧录 熟悉串口调试工具sscom的使用 官方文档中控制核心板上LED的led_example.c讲解及演示 源码路径&#xff1a;applications/sample/wifi-iot/app/iothardware/led_example.cHarmony OS …...

1.1-数组-704. 二分查找★

704. 二分查找 ★ 力扣题目链接&#xff0c;给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;搜索 nums 中的 target&#xff0c;如果存在返回下标&#xff0c;否则返回 -1。n 将在 [1, 10000]之间。 可以假设 nums 中的所…...

人物百度百科怎么做?需要什么资料?

在互联网时代&#xff0c;百度百科作为国内最具权威性的知识分享平台&#xff0c;吸引了大量用户关注和参与。究竟哪些人适合创建和编辑人物百度百科呢&#xff1f;本文伯乐网络传媒将为您揭秘人物百度百科的适用人群&#xff0c;并详细介绍如何注册、登录、创建及维护人物百度…...

在基于Android相机预览的CV应用程序中使用 OpenCL

查看&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV4.9.0在Android 开发简介 下一篇&#xff1a;在 MacOS 中安装 本指南旨在帮助您在基于 Android 相机预览的 CV 应用程序中使用 OpenCL ™。教程是为 Android Studio 20…...

网络分类简述与数据链路层协议(PPP)

实验拓扑 实验要求 1、R1和R2使用PPP链路直连&#xff0c;R2和R3把2条PPP链路捆绑为PPP MP直连按照图示配置IP地址 2、R2对R1的PPP进行单向chap验证 3、R2和R3的PPP进行双向chap验证 实验思路 给R1、R2的S3/0/0接口配置IP地址&#xff0c;已给出网段192.168.1.0/24R2作为主…...

Linux文件系列:磁盘,文件系统,软硬链接

Linux文件系列:磁盘,文件系统,软硬链接 一.磁盘相关知识1.磁盘机械构成2.磁盘物理存储3.磁盘逻辑存储1.LBA地址2.磁盘的分区和分组 二.文件系统和inode1.inode结构体2.文件系统1.Super Block(超级块)2.Group Descriptor Table(块组描述表GDT)3.inode Table4.Data Blocks5.Block…...

GPT4.0

GPT4.0 支持官网所有功能以及所有第三方GPTS&#xff0c;完全同步官网。无需魔法&#xff0c;填写授权码直达官网。全天超18小时维护&#xff0c;无需担心不稳定。没有永久卡&#xff0c;3.5免费提供&#xff0c;4.0可以按需下单即可&#xff0c;不存在跑路。 需要的联系...

软件工程(双语)

教材《软件工程 实践者的研究方法》 双语教学&#xff0c;但目前感觉都是在讲没用的 ”过程决定质量&#xff0c;复用决定效率” 介绍 软工的本质 程序数据结构算法 软件程序文档&#xff08;需求、模型、说明书&#xff09; 软件应用&#xff1a; 系统软件 应用 工程/科学…...

网络——套接字编程UDP

目录 端口号 源端口号和目的端口号 认识TCP协议和UDP协议 网络字节序 socket编程接口 socket常见接口 sockaddr结构 UDP socket bind recvfrom sendto 编写客户端 绑定INADDR_ANY 实现聊天功能 端口号 在这之前我们已经说过源IP地址和目的IP地址&#xff0c;还有…...

FPGA_AD9361

1.集成12位DAC和ADC的一款器件&#xff0c;2个输入模拟通道和2个输出模拟通道 2.• TX频段&#xff1a;47 MHz至6.0 GHz • RX频段&#xff1a;70 MHz至6.0 GHz 3.SPI配置成LVDS或CMOS接口&#xff0c;也可以还可以选择FDD&#xff08;频分双工——全双工&#xff0c;操作时需…...

探讨Java代码混淆加固工具

摘要 本篇博客将介绍几种常用的Java代码混淆工具&#xff0c;如ProGuard、Allatori Java Obfuscator、VirboxProtector、ipaguard和DashO。我们将深入探讨它们的特点、功能以及在保护Java应用程序安全方面的作用。此外&#xff0c;还将强调在使用Java代码混淆工具时需要注意的安…...

Linux——du, df命令查看磁盘空间使用情况

一、实现原理&#xff1a; df 命令的全称是Disk Free &#xff0c;显而易见它是统计磁盘中空闲的空间&#xff0c;也即空闲的磁盘块数。它是通过文件系统磁盘块分配图进行计算出的。 du 命令的全称是 Disk Used &#xff0c;统计磁盘有已经使用的空间。它是直接统计各文件各目…...

数据库实验(一)SQL Server触发器

目录 触发器的定义 触发器和存储过程的区别 触发器的优点 触发器的作用 触发器的分类 DML触发器 DDL触发器 登录触发器 触发器的工作原理 inserted表 deleted表 创建触发器 编程要求 测试要求&#xff1a; 实验代码&#xff1a; 触发器的定义 触发器是建立在触…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT&#xff0c;橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版&#xff1a;职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill

视觉语言模型&#xff08;Vision-Language Models, VLMs&#xff09;&#xff0c;为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展&#xff0c;机器人仍难以胜任复杂的长时程任务&#xff08;如家具装配&#xff09;&#xff0c;主要受限于人…...

LRU 缓存机制详解与实现(Java版) + 力扣解决

&#x1f4cc; LRU 缓存机制详解与实现&#xff08;Java版&#xff09; 一、&#x1f4d6; 问题背景 在日常开发中&#xff0c;我们经常会使用 缓存&#xff08;Cache&#xff09; 来提升性能。但由于内存有限&#xff0c;缓存不可能无限增长&#xff0c;于是需要策略决定&am…...

day36-多路IO复用

一、基本概念 &#xff08;服务器多客户端模型&#xff09; 定义&#xff1a;单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用&#xff1a;应用程序通常需要处理来自多条事件流中的事件&#xff0c;比如我现在用的电脑&#xff0c;需要同时处理键盘鼠标…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用

在工业制造领域&#xff0c;无损检测&#xff08;NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统&#xff0c;以非接触式光学麦克风技术为核心&#xff0c;打破传统检测瓶颈&#xff0c;为半导体、航空航天、汽车制造等行业提供了高灵敏…...