LeetCode---390周赛

题目列表

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

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

3092. 最高频率的 ID

3093. 最长公共后缀查询

一、每个字符最多出现两次的最长子字符串

非常经典的滑动窗口问题,即动态维护一段区间,使得这段区间满足题目要求,代码如下

class Solution {
public:int maximumLengthSubstring(string s) {int cnt[26] = { 0 };int n = s.size();int ans = 0;for(int l = 0, r = 0; r < n; r++){cnt[s[r]-'a']++;while(cnt[s[r]-'a']>2){cnt[s[l]-'a']--;l++;}ans = max(r-l+1,ans);}return ans;}
};

二、执行操作使数据元素之和大于等于K

题目中有 将元素+1复制元素 两个操作。我们先来想想这两个操作哪个先执行,结果会更优?很显然,先+1再x2得到的结果 比 先x2再+1得到的结果 更大,即我们应该优先进行+1操作,然后开始复制得到的数最大,但是我们要加到多大再进行复制需要的操作次数才最小呢?我们可以暴力枚举出所有情况,然后取得最大值,代码如下

class Solution {
public:int minOperations(int k) {int ans = INT_MAX;for(int i=1;i<=k;i++){// 进行 i-1 次 +1操作// 再进行 ceil((k-i)/i) (ceil---向上取整) 次 复制操作ans=min(ans,i-1+(k-i+i-1)/i);}return ans;}
};

那有没有更加优雅的做法呢?

我们来看看i-1+(k-1)/i这个表达式,用x替换成i,得到 f(x) = x-1+(k-1)/x,问如何取f(x)的最小值?这个高中都学过,对勾函数,当x=sqrt(k-1)时,f(x)最小(如果不知道对勾函数,对它进行求导找最小值也是可以的)这里我们的x要取整数。代码如下

class Solution {
public:int minOperations(int k) {// 进行 x-1 次 +1操作// 再进行 ceil((k-x)/x) (ceil---向上取整) 次 复制操作// f(x) = x-1+(k-x+x-1)/x = x-1+(k-1)/xif(k==1) return 0; // 分母不能为零,要特判int x = sqrt(k-1);if(x*x==k-1) return x*2-1;else return min(x-1+(k-1)/x,x+1-1+(k-1)/(x+1));}
};

三、最高频率的ID

本题就是要求我们在统计ID出现次数的基础上维护出现频率的最大值 ,统计ID出现次数很简单,我们可以用哈希表存储,关键是如何维护出现频率的最大值,可以用multiset来帮助我们维护最大值,代码如下

// 哈希表 + multiset
class Solution {
public:vector<long long> mostFrequentIDs(vector<int>& nums, vector<int>& freq) {int n = nums.size();vector<long long> ans(n);multiset<long long> s;unordered_map<int,long long> mp;for(int i = 0; i < n; i++){int x = nums[i];auto it = s.find(mp[x]);if(it != s.end())s.erase(it);mp[x]+=freq[i];s.insert(mp[x]);ans[i]=*s.rbegin();}return ans;}
};// 哈希表 + 堆(懒删除)  --- 可以了解一下
// 懒删除:当我们要取出堆顶元素的时候,看它的ID和freq是否匹配,
// 如果不匹配说明已经被修改,该数据无效 pop,如果相同,则是答案
class Solution {
public:vector<long long> mostFrequentIDs(vector<int>& nums, vector<int>& freq) {int n = nums.size();vector<long long>ans(n);priority_queue<pair<long long,int>> pq;//大堆<freq,ID>unordered_map<int,long long>mp;for(int i=0;i<n;i++){mp[nums[i]] += freq[i];pq.emplace(mp[nums[i]],nums[i]);while(pq.top().first!=mp[pq.top().second])pq.pop();ans[i]=pq.top().first;}return ans;}
};

 四、最长公共后缀查询

这题没啥可说的,之前周赛出过类似的,用字典树来做

代码如下

struct Node{Node* child[26]={0};int idx = -1;// 记录当前后缀下长度最短的字符串下标
};
class Solution {
public:vector<int> stringIndices(vector<string>& wordsContainer, vector<string>& wordsQuery) {// 建立字典树int pos = -1, mn = INT_MAX;Node*root = new Node;for(int i = 0; i < wordsContainer.size(); i++){const string &s = wordsContainer[i];int n = s.size();if(mn > n) pos = i, mn = n; // 找最短的字符串下标Node* cur = root;for(int j = n-1; j >= 0; j--){int x = s[j] - 'a';if(cur->child[x] == nullptr)cur->child[x] = new Node;cur = cur->child[x];if(cur->idx == -1 || wordsContainer[cur->idx].size() > n)cur->idx = i;}}// 查询int m = wordsQuery.size();vector<int> ans(wordsQuery.size(),-1);for(int i = 0; i < m; i++){const string &s = wordsQuery[i];int n = s.size();Node* cur = root;for(int j = n-1; j >= 0; j--){int x = s[j] - 'a';cur = cur->child[x];if(cur) ans[i] = cur->idx;else break;}if(ans[i] == -1) ans[i] = pos;}return ans;}
};

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

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

相关文章

JUC:park/unpark的用法与原理

park / unpark 用法 // 暂停当前线程 LockSupport.park(); // 恢复某个线程的运行 LockSupport.unpark(暂停线程对象)**先说结论&#xff1a;**无论unpark在park前还是后&#xff0c;都可以解除暂停状态。 先park在unpark可以成功运行&#xff1a; Thread t1 new Thread((…

全局UI方法-弹窗二-列表选择弹窗(ActionSheet)

1、描述 定义列表弹窗 2、接口 ActionSheet.show(value:{ title: string | Resource, message: string | Resource, autoCancel?: boolean, confrim?: {value: string | Resource, action: () > void }, cancel?: () > void, alignment?: DialogAlignment, …

kafka学习笔记02(小滴课堂)

Kafka命令行生产者发送消息和消费者消费消息实战 已存在的kafka不能重复创建。 broker设置的是1&#xff0c;factor大于broker了&#xff0c;所以报错。 生产者发送消息&#xff1a; kafka列表出现了新的kafka。 我们使用这个kafka。 我们启动消费者&#xff1a; 我们现在不从…

【Qt 学习笔记】Day1 | Qt 背景介绍

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Day1 | Qt 背景介绍 文章编号&#xff1a;Qt 学习笔记 / 01 文章目录…

C/C++语言实现简易通讯录 [含文件操作,循环双链表]

文章目录 C/C语言实现简易通讯录概要基本功能运行截图展示主要代码展示 &#x1f396; 博主的CSDN主页&#xff1a;Ryan.Alaskan Malamute &#x1f4dc; 博主的代码仓库主页 [ Gitee ]&#xff1a;ryanala [GitHub]&#xff1a; Ryan-Ala C/C语言实现简易通讯录 ⚠⚠⚠ …

话题通信的python实现

一、发布者Publisher的python实现 step1&#xff1a;在scripts文件夹中创建py节点 step2&#xff1a;第一行是为了指定解释器&#xff0c;Ubuntu20.04是python3&#xff0c;比他低的版本是python。第二行是为了指定编码方式。第五行中&#xff0c;引用index.ros.org中数据类型…

RVM安装ruby笔记

环境 硬件&#xff1a;Macbook Pro 系统&#xff1a;macOS 14.1 安装公钥 通过gpg安装公钥失败&#xff0c;报错如下&#xff1a; 换了几个公钥地址&#xff08;hkp://subkeys.pgp.net&#xff0c;hkp://keys.gnupg.net&#xff0c;hkp://pgp.mit.edu&#xff09;&#xff0c;…

论文笔记:Retrieval-Augmented Generation forAI-Generated Content: A Survey

北大202402的RAG综述 1 intro 1.1 AICG 近年来&#xff0c;人们对人工智能生成内容&#xff08;AIGC&#xff09;的兴趣激增。各种内容生成工具已经精心设计&#xff0c;用于生产各种模态下的多样化对象 文本&代码&#xff1a;大型语言模型&#xff08;LLM&#xff09;…

Java:链表

一、链表简介 1、链表与顺序表的区别 上一篇博客我介绍了顺序表&#xff0c;这次我们来认识认识链表&#xff01;先来看看二者的区别&#xff1a; 顺序表&#xff1a;由于顺序表实际上是一个数组&#xff0c;因此它在物理上是连续的&#xff0c;逻辑上也是连续的&#xff01; …

【IDEA】使用debug方式去运行java程序

什么是debug工具&#xff1f; 调试工具&#xff08;debug工具&#xff09;是一种用于帮助程序员识别和修复程序中的错误的工具。它们提供了一系列的功能&#xff0c;帮助程序员在代码执行的过程中跟踪和检测问题&#xff0c;例如查看变量的值、检查函数的调用栈、设置断点来停…

Spring学习——什么是循环依赖及其解决方式

文章目录 前言一、什么是循环依赖二、解决思路1、循环依赖分类2、对象初始化步骤及对象分类3、spring是如何解决的4、图解5、三级缓存1、区别2、ObjectFactory是什么 三、源码debug1、spring创建对象过程1、dubug第一步——找到getBean2、dubug第二步——getBean与doGetBean3、…

腾讯 tendis 替代 redis linux安装使用

下载地址 Tendis存储版 点击下载 linux 解压 tar -zxvf 安装包.tgz cd 解压安装包/scripts 启动 ./start.sh 停止 ./stop.sh 详细配置 修改 /scripts tendisplus.conf # tendisplus configuration for testing # 绑定本机IIP bind 192.168.31.112 port 51002 #设…

海格里斯助推实体制造业转型升级 “算法定义硬件”解题AIoT市场

随着自动化的发展&#xff0c;电子商务和智能制造推动了自动化立体仓库的快速发展与创新&#xff0c;产生了“密集仓储”的概念。对于一个实体企业来讲&#xff0c;其数智物流转型正在趋向于“去伪存真”&#xff0c;企业追求高ROI与真实经济价值&#xff0c;具有降本增效的业务…

JavaEE 初阶篇-深入了解多线程安全问题(出现线程不安全的原因与解决线程不安全的方法)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 多线程安全问题概述 1.1 线程不安全的实际例子 2.0 出现线程不安全的原因 2.1 线程在系统中是随机调度且抢占式执行的模式 2.2 多个线程同时修改同一个变量 2.3 线…

游戏行业行业竞争越来越激烈,遇到DDoS攻击遭受严重损失该如何解决

近年来&#xff0c;我们见证了数字化的快速发展&#xff0c;随着这样的发展&#xff0c;网络的威胁也逐渐增多&#xff0c;在网络攻击门槛不断降低&#xff0c;行业竞争越来越激烈&#xff0c;游戏行业的DDoS攻击如雨点般密集&#xff0c;在整个DDoS攻击的份额中&#xff0c;游…

SpringAMQP-Exchange交换机

1、Fanout-Exchange的特点是&#xff1a;和它绑定的消费者都会收到信息 交换机的作用是什么? 接收publisher发送的消息将消息按照规则路由到与之绑定的队列不能缓存消息&#xff0c;路由失败&#xff0c;消息丢失FanoutExchange的会将消息路由到每个绑定的队列 声明队列、交…

【实验报告】--基础VLAN

【VLAN实验报告】 一、项目背景 &#xff08;为 Jan16 公司创建部门 VLAN&#xff09; Jan16 公司现有财务部、技术部和业务部&#xff0c;出于数据安全的考虑&#xff0c;各部门的计算机需进 行隔离&#xff0c;仅允许部门内部相互通信。公司拓扑如图 1 所示&#xff0c; …

http和https的工作原理是什么?

HTTP&#xff08;HyperText Transfer Protocol&#xff09;和HTTPS&#xff08;HyperText Transfer Protocol Secure&#xff09;是两种用于在互联网上传输数据的主要协议&#xff0c;它们均用于在客户端&#xff08;通常是Web浏览器&#xff09;与服务器之间交换信息。尽管它们…

.NET CORE 分布式事务(二) DTM实现TCC

目录 引言&#xff1a; 1. TCC事务模式 2. TCC组成 3. TCC执行流程 3.1 TCC正常执行流程 3.2 TCC失败回滚 4. Confirm/Cancel操作异常 5. TCC 设计原则 5.1 TCC如何做到更好的一致性 5.2 为什么只适合短事务 6. 嵌套的TCC 7. .NET CORE结合DTM实现TCC分布式事务 …

访学博后须知|携带手机等电子产品入境美国注意事项

美国对携带手机等电子产品入境有着严格的规定&#xff0c;因此知识人网小编提醒拟出国做访问学者、博士后或联合培养的博士生了解以下注意事项&#xff0c;尽量减少不必要的麻烦。 随着互联网的普及&#xff0c;手机等电子产品在人民生活中占有不可或缺的地位。因为研究和工作需…