LeetCode---396周赛

题目列表

3136. 有效单词

3137. K 周期字符串需要的最少操作次数

3138. 同位字符串连接的最小长度

3139. 使数组中所有元素相等的最小开销

一、有效单词

 按照题目要求,统计个数,看是否符合条件即可,代码如下

class Solution {
public:bool isValid(string word) {string str = "aeiou";if(word.size()<3) return false;bool flag1 = false, flag2 = false;for(auto e:word){if(isdigit(e)) continue;if(isalpha(e)){if(str.find(tolower(e))==string::npos) flag1 = true;else flag2 = true;}else{return false;}}return flag1&&flag2;}
};

二、K周期字符串需要的最少操作次数

这题本质就是要将所给字符串分成长度为k的一个个子串,然后找这些子串中出现次数最多的,将其他的子串换成出现次数最多的子串,这样我们的操作次数最少。

这里要能想明白:题目要求我们将字符串变成周期为k的字符串<=>我们将字符串分成长度为k的子串,使得子串相同

代码如下

class Solution {
public:int minimumOperationsToMakeKPeriodic(string word, int k) {int n = word.size();int ans = 0;unordered_map<string,int>cnt;for(int i=0;i<n;i+=k){ans = max(ans,++cnt[word.substr(i,k)]);}return n/k - ans;}
};

三、同位字符串连接的最小长度

这题只要从小到大枚举可以的最小长度即可,可能有人觉得这样做会超时,但是不会,因为我们枚举的数是有条件的,它们得是字符串长度的因子,因为题目的第一句话就说我们要用字符串t和若干个t的同位字符串连接成s,而10^5以内的数的因子个数并不是很多,然后我们只要判断字符串是否能拆分成同位字符串即可,代如下码

class Solution {
public:int minAnagramLength(string s) {int n = s.size();vector<vector<int>>pre(n+1,vector<int>(26));for(int i=0;i<n;i++){pre[i+1]=pre[i];pre[i+1][s[i]-'a']++;}for(int i=1;i<=n;i++){// 枚举长度if(n%i) continue;// i得是n的因子bool flag = true;for(int j=2*i;j<=n;j+=i){for(int k=0;k<26;k++){if(pre[i][k]!=pre[j][k]-pre[j-i][k]){flag = false;goto end;}}}end:if(flag) return i;            }return -1;}
};

四、使数组中所有元素相等的最小开销

这题纯纯数学题,两个操作需要我们进行选择,是优先选择操作一,还是优先操作方案二,或者其他选法?

首先,我们肯定能想到如果cost1*2<=cost2,也就是说平均一次+1操作,操作一的开销更少,那么我们肯定选操作一将所有的数增大为数组中的最大值,这样的开销最少。

那么如果cost1*2>cost2呢?也就是说平均一次+1操作,操作二的开销更少,即我们需要优先进行操作二,让所有小于最大值的数尽可能的往最大值靠近,如果无法进行操作二,我们就选择操作一

可能很多人会这么想,但是这样做并不正确,因为如果开销操作二的足够小,操作一的开销足够大,那么我们完全可以将选一个更大的最大值,从而选择在进行多次操作二,以实现所有数字相同

也就是说我们不确定哪一个数作为最大值会最优,所以我们可以枚举最大值。

那么最大值的上界在哪里呢?我们总不能往后一直枚举。在说明这个问题之前,我们先来想想当我们选定一个最大值时,如何尽可能的选择操作二?如下

从上图可知:

1、mx <= s - mx时,花销为s/2*cost2+(s&1)*cost1

2、mx > s - mx时,花销为(s-mx)*cost2+(mx-(s-mx))*cost1=cost2*(s-mx)+cost1*(2mx-s)

其中mx为需要增加到最大值的最大+1次数,s为总共+1次数

那么我们如何确定我们的枚举上界呢?我们知道当我们的枚举上界越大时,需要+1的次数也会更多,从mx 和 s - mx 的不等式来看,mx的增加次数远远小于s - mx的增加次数,也就是说mx<=s-mx会一直保持不变,花销【s/2*cost2+(s&1)*cost1】只会越来越大所以我们枚举到mx <= s - mx时即可

设枚举到x即可,mn=min(nums),mx=max(nums),s为x=mx时,总共+1次数

2*(x - mn) <= s + (x - mx)*n  =>  x >= (n*mx-2*mn-s)/(n-2) 所以x最多为2*mx

代码如下

class Solution {const int MOD = 1e9+7;
public:int minCostToEqualizeArray(vector<int>& nums, int c1, int c2) {int n = nums.size();long long s = 0;int mx = ranges::max(nums);int mn = ranges::min(nums);for(auto x:nums) s += mx - x;if(c1*2<=c2) return s*c1%MOD;long long ans = LLONG_MAX;for(int x=mx;x<=2*mx;x++){int d = x - mn;long long res;if(d<=s-d) res = s/2*c2+s%2*c1;else res = (s-d)*c2 +(d*2-s)*c1;ans=min(ans,res);s += n;}return ans%MOD;}
};

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

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

相关文章

Android 简单的下拉选择框实现

要实现这种效果,目前知道的方法有以下两种,Spinner 和 ListPopupWindow,当然肯定还有很多别的方法,这里我们先尝试使用ListPopupWindow来实现这个效果; 以下是一个简单的demo: public class MainActivity extends AppCompatActivity {private List<String> dataList;pr…

AIGC|将GPTBots与10000+主流软件连接,实现应用场景全覆盖

一、自动化工作流的无限可能&#xff0c;由AI带来 当前市场上存在许多自动化工作流工具&#xff0c;这些工具在很大程度上提升了人们的工作效率&#xff0c;为企业节省了大量时间和人力成本。然而&#xff0c;这些工具并非万能&#xff0c;它们在实际应用中仍存在一定的局限性…

1056: 邻接表到邻接矩阵

解法&#xff1a; #include<iostream> #include<vector> #include<string> using namespace std; int arr[100][100]; int main() {int n;cin >> n;getchar();vector<string> s(n);for (int i 0; i < n; i) {getline(cin, s[i]);}for (int …

波动性悖论:为何低风险股票长期跑赢高风险对手?

从去年开始&#xff0c;“红利低波”类的产品净值稳步向上&#xff0c;不断新高&#xff0c;让很多人关注到了A股“分红高”、“波动率低”这两类股票。分红高的公司更受投资者青睐&#xff0c;这从基本面的角度很容易理解&#xff0c;那么波动率低的股票明明波动更小&#xff…

[数据集][目标检测]交通灯检测数据集VOC+YOLO格式2600张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2600 标注数量(xml文件个数)&#xff1a;2600 标注数量(txt文件个数)&#xff1a;2600 标注…

用户登录后端:验签

前端请求拦截器 工具类 cryptomd5Util.js const crypto require(crypto) const publicKey xxxx export function encryptedHmacMd5Data(appid, data, timestamp) {const hmac crypto.createHmac(md5, publicKey)let params dataif (typeof data object) {for (const i in…

Axure RP移动端交互元件库/交互原型模板

作品类型&#xff1a;元件库/原型模板 更新日期&#xff1a;2023-12-04 当前版本&#xff1a;V1.3 适用范围&#xff1a;App应用/小程序 Axure版本&#xff1a;Axure 9.0均可打开 文件大小&#xff1a;36.7M 历时两个月制作并整理了手机移动端常用的75种组件、90个常用界面模板…

电影网站|基于SSM+vue的电影网站系统(源码+数据库+文档)

电影网站 目录 基于SSMvue的电影网站系统 一、前言 二、系统设计 三、系统功能设计 1 系统功能模块 2 管理员功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设布道…

Kafka和Spark Streaming的组合使用学习笔记(Spark 3.5.1)

一、安装Kafka 1.执行以下命令完成Kafka的安装&#xff1a; cd ~ //默认压缩包放在根目录 sudo tar -zxf kafka_2.12-2.6.0.tgz -C /usr/local cd /usr/local sudo mv kafka_2.12-2.6.0 kafka-2.6.0 sudo chown -R qiangzi ./kafka-2.6.0 二、启动Kafaka 1.首先需要启动K…

CentOS 磁盘扩容与创建分区

文章目录 未分配空间创建新分区重启服务器添加物理卷扩展逻辑卷 操作前确认已给服务器增加硬盘或虚拟机已修改硬盘大小&#xff08;必须重启服务才会生效&#xff09;。 未分配空间 示例说明&#xff1a;原服务器只有40G&#xff0c;修改虚拟机硬盘大小再增加20G后硬盘变为60G。…

macOS上将ffmpeg.c编译成Framework

1 前言 本文介绍下在macOS上将ffmpeg的fftools目录下的ffmpeg.c程序&#xff0c;也就是ffmpeg的命令行程序&#xff0c;编译成framework的方法。编译成.a或.dylib的方法类似。 编译环境如下&#xff1a; xcode15.3&#xff1b;ffmpeg release/6.1; 2 编译ffmpeg 首先clone我们…

stl学习以及abc比赛例题

1.引例 一提到查找&#xff0c;我们一上来想的肯定是find()函数或者search()函数&#xff0c;但是这种查找的底层逻辑终究是用顺序查找的方式&#xff0c;运行的时间成本非常高昂&#xff0c;所以平时能不用就不用&#xff0c;比赛的时候用这种查找和自己while遍历&#xff0c…