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)/x
        if(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;
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录-二叉树(路径)

目录 257. 二叉树的所有路径 题目描述&#xff1a; 输入输出描述&#xff1a; 思路和想法&#xff1a; 404. 左叶子之和 题目描述&#xff1a; 输入输出描述&#xff1a; 思路和想法&#xff1a; 513.找树左下角的值 题目描述&#xff1a; 输入输出描述&#xff1a;…

刷爆LeetCode:两数之和 【1/1000 第一题】

&#x1f464;作者介绍&#xff1a;10年大厂数据\经营分析经验&#xff0c;现任大厂数据部门负责人。 会一些的技术&#xff1a;数据分析、算法、SQL、大数据相关、python 作者专栏每日更新&#xff1a;LeetCode解锁1000题: 打怪升级之旅https://blog.csdn.net/cciehl/category…

如何在OceanBase的OCP多节点上获取日志

背景 在使用OceanBase的OCP的过程中&#xff0c;因各种因素&#xff0c;我们可能需要对当前页面进行跟踪。在单一ocp节点环境下&#xff0c;我们自然可以直接在该节点上查找所需的日志。然而&#xff0c;当我们的环境中部署了多个ocp节点时&#xff0c;在排查问题时就会变得相…

让机器理解语言,从字词开始,逐步发展到句子和文档理解:独热编码、word2vec、词义搜索、句意表示、暴力加算力

让机器理解语言&#xff0c;从字词开始&#xff0c;逐步发展到句子和文档理解&#xff1a;独热编码、词嵌入、word2vec、词义搜索、句意表示、暴力加算力 独热编码&#xff1a;分类 二进制特征Word2Vec 词嵌入&#xff1a; 用低维表示 用嵌入学习 用上下文信息Skip-gram 跳字…

工业测试测量仪器与人工智能(AI)如何结合

工业测试测量仪器与人工智能&#xff08;AI&#xff09;的结合可以通过多种方式实现&#xff0c;其中一些主要方法包括&#xff1a; 1. 数据分析和预测 智能数据分析&#xff1a;利用AI算法对从传感器和测试仪器收集的数据进行分析&#xff0c;识别模式、趋势和异常&#xff0…

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;…

瑞吉外卖实战学习--6、通过try和catch进行异常处理

try和catch进行异常处理 效果图前言1、公共拦截器进行异常处理1.1、创建公共报错处理的方法1.2、@ControllerAdvice中设置要拦截的类1.3、@ExceptionHandler中写处理的异常类2、完善错误拦截器2.1、效果效果图 前言 当用户名重复数据库会报错,此时就需要捕获异常操作 1、公共…

LM算法探寻——答案在022浙江大学信号与系统

LM算法详解 | 宇尘 (gitee.io) 求函数最小值&#xff0c;从另一个角度理解是求误差最小值。 梯度 最陡梯度下降算法和LMS算法原理介绍及MATLAB实现_lms滤波器中的梯度下降-CSDN博客 均值即平均值 (3 封私信 / 56 条消息) FIR滤波器中的冲激响应怎么理解&#xff1f; 和滤波有…

查找某数据在单链表中出现的次数

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> typedef int ElemType; typedef struct LinkNode {ElemType data;LinkNode* next; }LinkNode, * LinkList; //尾插法建立单链表 void creatLinkList(LinkList& L) {L (LinkNode*)mallo…

微分方程错题本

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

ssm008医院门诊挂号系统+jsp

医院门诊挂号系统 摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;医院门诊挂号系统当然也不能排除在外。医院门诊挂号系统是以实际运用为开发背景&#xff0c;运用软件…

笔迹/签名数据集汇总

这里只收集公开/易申请的数据集 数据集发表年份语言最小单元Writers/人规模颜色最小单元文件格式示例图片备注CSAFE Handwriting Database2019英语页9090 人*(3 次*9 个样本) 2430 页300 dpi 扫描png-HWDB2.0-2.22011汉字页1,019每人 5 页,共 5091 页灰度图dgrl-CEDAR2006英语…

代码随想录算法训练营Day39|LC62 不同路径LC63 不同路径II

一句话总结&#xff1a;不是太难&#xff0c;状态转移方程好想。 原题链接&#xff1a;62 不同路径 位置为(i, j)的点只能从上面或者左边过来&#xff0c;由此可列出状态转移方程。状态转移方程的初始化为所有第一排和第一列的点都初始化为1即可。 class Solution {public i…

搜索与图论——染色法判定二分图

一个图是二分图当且仅当这个图中不含奇数环 由于图中没有奇数环&#xff0c;所以染色过程中一定没有矛盾 所以一个二分图一定可以成功被二染色&#xff0c;反之在二染色的过程中出现矛盾的图中一定有奇数环&#xff0c;也就一定不是二分图 #include<iostream> #includ…

深度学习导论

具有非常详尽的数学推导过程 概述 定位 比较传统机器学习深度学习特征人工定义机器生成模型决策树、SVM、贝叶斯等&#xff08;具有不同数学原理&#xff09;神经网络 概率论 联合概率 P ( X , Y ) P ( X ∣ Y ) P ( Y ) P ( Y ∣ X ) P ( X ) P(X,Y)P(X|Y)P(Y)P(Y|X)P(X…

牛客NC31 第一个只出现一次的字符【simple map Java,Go,PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/1c82e8cf713b4bbeb2a5b31cf5b0417c 核心 Map参考答案Java import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可*…

rabbitMQ的基础操作与可视化界面

当你安装好RabbitMq时&#xff0c;可以 尝试一下&#xff0c;这些命令 启动rabbitMQ服务 #启动服务 systemctl start rabbitmq-server #查看服务状态 systemctl status rabbitmq-server #停止服务 systemctl stop rabbitmq-server #开机启动服务 systemctl enable rabbitmq-…

电商系列之售后退货

> 插&#xff1a;AI时代&#xff0c;程序员或多或少要了解些人工智能&#xff0c;前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 坚持不懈&#xff0c;越努力越幸运&#xff0c;大家…

基于JavaWEB SSM SpringBoot婚纱影楼摄影预约网站设计和实现

基于JavaWEB SSM SpringBoot婚纱影楼摄影预约网站设计和实现 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言…

Redis命令-SortedSet类型

4.8 Redis命令-SortedSet类型 Redis的SortedSet是一个可排序的set集合&#xff0c;与Java中的TreeSet有些类似&#xff0c;但底层数据结构却差别很大。SortedSet中的每一个元素都带有一个score属性&#xff0c;可以基于score属性对元素排序&#xff0c;底层的实现是一个跳表&a…