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

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

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

相关文章

Java - Json字符串转List<LinkedHashMap<String,String>>

需求&#xff1a;在处理数据时&#xff0c;需要将一个Object类型对象集合转为有序的Map类型集合。 一、问题 1.原代码&#xff1a; 但在使用时出现报错&#xff1a; Incompatible equality constraint: LinkedHashMap<String, String> and LinkedHashMap 不兼容的相等…

初识sql注入--手工注入

目录 可能使用的sql函数 入侵网站方式 1、文件上传漏洞 2、rce 3、sql注入 SQL注入 什么是sql注入 进行SQL注入 实验环境 开始实验&#xff08;使用information_shema数据库&#xff09; 1、进入靶场 2、报列数 下面来解释一下为什么要照上面SQL语句写 url编码 单…

Linux-vi、vim

使用Xshell远程登录到Linux主机进行操作 命令行不用全部掌握&#xff0c; 一般编辑大文件&#xff0c;比较复杂的情况下&#xff0c; 我们还是使用Xftp工具&#xff0c; down下来再恢复回去。

有边数限制的最短路

文章目录 题目 有边数限制的最短路算法分析1、问题&#xff1a;为什么Dijkstra不能使用在含负权的图中&#xff1f;dijkstra详细步骤2、什么是bellman - ford算法&#xff1f;3、bellman - ford算法的具体步骤4、在下面代码中&#xff0c;是否能到达n号点的判断中需要进行if(di…

Seaborn : 超好用的Python可视化工具

1. 引言 说到数据可视化&#xff0c;Seaborn就像一颗隐藏的宝石&#xff01;在进行探索性数据分析时&#xff0c;我们通常从Matplotlib 开始&#xff0c;而对 Seaborn 的探索相对较少&#xff01;但是&#xff0c;只要你了解 Seaborn 的全部潜力&#xff0c;你就会惊奇地发现&…

安全工程师面试题

安全工程师面试题安全工程师是一个非常重要的职位&#xff0c;他们负责保护公司的网络和系统免受黑客和恶意软件的攻击。如果你想成为一名安全工程师&#xff0c;那么你需要准备好面试。下面是一… 1安全工程师面试题 安全工程师是一个非常重要的职位&#xff0c;他们负责保护…

C++Linux系统编程——makefile

Makefile Makefile简介 一个工程中的源文件不计其数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;makefile定义了一系列的规则来指定&#xff0c;哪些文件需要先编译&#xff0c;哪些文件需要后编译&#xff0c;哪些文件需要重新编译&#xff0c;甚至于…

基于Django实现的校园疫情监控平台

基于Django实现的校园疫情监控平台 开发语言:Python 数据库&#xff1a;MySQL所用到的知识&#xff1a;Django框架工具&#xff1a;pycharm、Navicat、Maven 系统功能实现 登录注册功能 用户在没有登录自己的用户名之前只能浏览本网站的首页&#xff0c;想要使用其他功能都会…

sqli-labs靶场第十四关

目录 1&#xff1a;分析 找闭合符&#xff1a; 2&#xff1a;开始注入 报错注入&#xff1a; 注入数据库名&#xff1a; 注入表名&#xff1a; 注入列名&#xff1a; 注入具体值&#xff1a; 1&#xff1a;分析 经过我们的实验发现当我们输入的密码后面存在双引号时会报…

构建内网yum仓库

1、环境介绍 系统&#xff1a;龙蜥os 7.9 2、安装epel源 yum install epel-release -y3、安装nginx服务器并启动 yum install nginx httpd -y配置 server {listen 80;server_name repo.wtown.com;root /usr/share/nginx/html/repo;index index.html index.htm;location / {…

阿里云ECS服务器实例挂载数据盘步骤(磁盘自动挂载.、访问挂载点)

阿里云ECS服务器实例挂载数据盘步骤 相关指令 df -h 查看磁盘空间 du -sh * 查看使用内存大小1.磁盘自动挂载 首先登录阿里云ECS服务器&#xff0c;通过 df -h 命令查看当前磁盘挂载情况 通过 fdisk -l 命令查看磁盘情况&#xff0c;可以发现有两个盘&#xff1a; 系统盘 …

Ubuntu 和 Windows之间无法复制粘贴问题解决方法

需要安装open-vm-tools&#xff0c;官方安装open-vm-tools的网址&#xff1a;安装 Open VM Tools (vmware.com)

安全测试工具Nessus安装和使用

安装 下载地址&#xff1a;https://pan.baidu.com/s/1OaYMDdQqYI4BbZ_uUErrTw 提取码: yg2g 安装Nessus-8.14.0-x64.msi&#xff0c;按照提示next至安装完成&#xff0c;显示如下页面&#xff0c;点击Connect via SSL 点击“高级”、“继续访问” 选择 【Managed Scanner】选…

Visual Studio,第1个hello world,入门C++,分别编译一个可以在Windows和Linux下运行的程序

本人的VxTerm&#xff0c;是在Visual Studio 2022下编写的。 其它的语言工具是不是也可以那么方便的使用&#xff0c;本人并不得而知&#xff0c;至少本人能知道&#xff1a;对于我来说&#xff0c;Visual Studio可以让我觉得C/C语言非常简单&#xff01; 一、安装Visual Stu…

stm32——OLED篇

技术笔记&#xff01; 一、OLED显示屏介绍&#xff08;了解&#xff09; 1. OLED显示屏简介 二、OLED驱动原理&#xff08;熟悉&#xff09; 1. 驱动OLED驱动芯片的步骤 2. SSD1306工作时序 三、OLED驱动芯片简介&#xff08;掌握&#xff09; 1. 常用SSD1306指令 2. …

apache atlas 如何自定义hook

atals 是开源的数据元数据和数据资产管理平台&#xff0c;平台设计支持强大的图数数据库&#xff0c;nosql&#xff0c;和搜索引擎3个组件构建。都是基于开源构建。 目前市场上开源的元数据管理工具有Atlas&#xff0c; Datahub&#xff0c; Openmetadata等&#xff0c;你要说二…

进程间通信:连接不同程序世界的桥梁

目录 一、进程间通信的重要性 二、常见的进程间通信方式 三、进程间通信的目的 四、进程间通信的本质 在计算机编程的领域中&#xff0c;进程间通信&#xff08;Inter-Process Communication&#xff0c;IPC&#xff09;是一个至关重要的概念。当我们在操作系统中运行多个程…

Vue中进行粘贴板粘贴数据(图片、文字等)

在页面中如果需要进行粘贴数据&#xff0c;那么就要读取系统粘贴板clipboard&#xff0c;通过此Api来进行粘贴板数据的操作。 目录: 一.封装相关函数1.示例代码&#xff1a;2.代码解释&#xff1a; 二.页面中进行粘贴1.代码示例&#xff1a;2.代码解释&#xff1a; 三.运行结果…

linux day 3

touch 创建文件命令 cat命令&#xff0c;查看文件内容 more命令&#xff0c;查看文件内容。 cat是直接全部显示出来&#xff0c;more是支持翻页&#xff0c;即文件内容过多可以一页一页显示&#xff08;按空格翻页&#xff0c;按Q进行退出&#xff09; cp命令&#xff0c;复制…

数据结构深入理解--栈

目录 一、栈的定义 二、栈的实现 2.1 栈的结构 2.2 栈的初始化 2.3 栈的销毁 2.3 栈元素的插入 2.4 栈元素的删除 2.5 栈顶元素获取 2.6 栈元素有效个数获取 2.7 栈是否为空判断 三、代码总览 Stack.h Stack.c 测试代码:test.c 四、例题 例一&#xff1a; 例二&#xff…