【LeetCode周赛】LeetCode第373场周赛

LeetCode第373场周赛

目录

  • 循环移位后的矩阵相似检查
  • 统计美丽子字符串 I
  • 交换得到字典序最小的数组
  • 统计美丽子字符串 II

循环移位后的矩阵相似检查

循环移位后的矩阵相似检查
分析:
简单模拟
这道题目就是一个简单的模拟题,直接按照题目意思进行判断即可。不难发现,其实左移,右移后如果初始矩阵和最终矩阵完全相同,那么左移,右移是等价的,比如对于下标为j的数,右移后相等即 m a t [ i ] [ j ] = = m a t [ i ] [ j + k ] mat[i][j] == mat[i][j+k] mat[i][j]==mat[i][j+k],对于下标为j+k的数,左移后相等即 m a t [ i ] [ j + k ] = = m a t [ i ] [ j ] mat[i][j + k] == mat[i][j] mat[i][j+k]==mat[i][j]。所以二者等价。

代码:

class Solution {
public:bool areSimilar(vector<vector<int>>& mat, int k) {bool flag = true;int n =  mat.size(), m =  mat[0].size();k %= m;for(int i = 0; i < n; i++){for(int j = 0; j < m; j++){int v = (j + k) % m;if(mat[i][v] == mat[i][j])continue;flag = false;}}return flag;}
};

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( 1 ) O(1) O(1)

统计美丽子字符串 I

统计美丽子字符串 I
分析:
维护前缀和
对于这个题目,因为数据范围较小,所以可以使用 O ( n 2 ) O(n^2) O(n2)的算法。如果直接暴力枚举每一个子字符串,再来判断是否是美丽子字符串的话,时间复杂度为 O ( n 3 ) O(n^3) O(n3),那么我们可以在判断是否是美丽子字符串上来优化。
如何判断一个字符串是美丽的呢?我们可以提前维护一个前缀的元音,辅音字母的数量,那么可以在 O ( 1 ) O(1) O(1)的时间复杂度下,得到一个区间的元音,辅音数量,再按照题目意思进行判断即可

代码:

class Solution {
public:int beautifulSubstrings(string s, int k) {int n = s.size();//预处理一个前缀的元音,辅音数量vector<int>pre1(n + 1, 0), pre2(n + 1, 0);for(int i = 0; i < n ; i++){if(s[i] == 'a' || s[i] == 'e' || s[i] == 'i' || s[i] == 'o' || s[i] == 'u')pre1[i + 1] = pre1[i] + 1, pre2[i + 1] = pre2[i];else pre2[i + 1] = pre2[i] + 1, pre1[i + 1] = pre1[i];}int cnt = 0;for(int l = 0; l < n ; l++){for(int r = l + 1; r < n; r ++){int a = pre1[r + 1] - pre1[l];int b = pre2[r + 1] - pre2[l];if(a == b && (a * b) % k == 0)cnt++;}}return cnt;}
};

时间复杂度: O ( n 2 ) O(n^2) O(n2)
空间复杂度: O ( n 2 ) O(n^2) O(n2)

交换得到字典序最小的数组

交换得到字典序最小的数组
分析:
排序+分组维护
分析题意我们可以知道,对于两两之间距离在limit范围内的两个数,我们将它们添加进一个组里面,最终可以得到若干两两相距在limit范围内的数。比如 l i m i t = 2 limit=2 limit=2,对数组 [ 1 , 5 , 3 , 9 , 8 ] [1,5,3,9,8] [1,5,3,9,8] [ 1 , 3 , 5 ] [1,3,5] [1,3,5] [ 8 , 9 ] [8,9] [8,9]分别为一组。这样的每一组里面的所有数字,都是可以任意交换位置的(不能直接交换的数也可以间接的交换)。所以本题,我们的目的就是要得到若干个这样的组,对每个组里面按照从小到大的顺序排序,就是最终的结果。
具体要怎么做呢?
首先我们可以维护一个 q q q数组,它代表的是 n u m s nums nums数组的值,从小到大排序后,原来的下标的序列。
然后我们遍历这个序列,每一次处理一段数字,这一段数字要求满足相邻两个数之间的距离 ≤ l i m i t \le limit limit
比如对于数组 [ 1 , 7 , 6 , 18 , 2 , 1 ] [1,7,6,18,2,1] [1,7,6,18,2,1],其 q q q数组为 [ 0 , 5 , 4 , 2 , 1 , 3 ] [0,5,4,2,1,3] [0,5,4,2,1,3]。处理的第一段数字为 [ 0 , 5 , 4 ] [0,5,4] [0,5,4],即下标为0,5,4的三个数。那么对这三个数,直接按照从小到大的顺序放在0,4,5的三个位置即可。因为只有这一段数字里面的位置可以任意交换。可以用set来存下来这几个下标,存入后是按照顺序排列的,然后直接放入这几个数字即可。

代码:

class Solution {
public:vector<int> lexicographicallySmallestArray(vector<int>& nums, int limit) {//在limit范围内,可以构成多个闭环,每一个闭环按照顺序排序即可int n = nums.size();vector<int>q(n);iota(q.begin(), q.end(), 0);sort(q.begin(), q.end(),[&](int i, int j){return nums[i] < nums[j] ;});//处理每一个limit范围vector<int>ans(n);for(int l = 0; l < n; ){int r = l + 1;set<int>p;p.insert(q[l]);while(r < n && nums[q[r]] - nums[q[r - 1]] <= limit){p.insert(q[r]);r++;}// cout<<l<<" "<<r<<endl;//l~r是一个limit范围内的一些数字,这里面的数字可以随意交换位置auto it = p.begin();for(int i = l; i < r; i++, it++)ans[*it] = nums[q[i]];l = r;}return ans;}
};

时间复杂度: O ( n log ⁡ n ) O(n \log n) O(nlogn)
空间复杂度: O ( n ) O(n) O(n)

统计美丽子字符串 II

统计美丽子字符串 II

分析:
前缀和+分解质因数+哈希表
这道题是I的加强版,数据范围变大了,所以在I中使用的前缀和的 O ( n 2 ) O(n^2) O(n2)算法不适用了。
那么我们要考虑更加快速的方法。
前缀和
首先我们换一种维护前缀和的思路,不妨令元音为1,辅音为-1。则元音字母和辅音字母的数量相等即找到一个和为0的连续子数组。
则任何一个满足条件的子数组 ( j , i ] (j,i] (j,i]中,有 s u m [ i ] − s u m [ j ] = 0 sum[i] - sum[j] = 0 sum[i]sum[j]=0
分解质因数
设子数组的长度为L,由于元音辅音数量相等,所以元音辅音数量都等于 L 2 \frac{L}{2} 2L ,所以元音字母和辅音字母的数量的乘积能被k整除等价于
( L 2 ) 2 m o d k = 0 (\frac{L}{2})^2\ mod \ k = 0 (2L)2 mod k=0

L 2 m o d ( 4 k ) = 0 L^2\ mod \ (4k) = 0 L2 mod (4k)=0
再来考虑,如果 L 2 m o d k ′ = 0 L^2 mod \ k' = 0 L2mod k=0时, L L L满足什么条件呢?
假设 k ’ k’ k是一个质数,假如是 3 3 3,那么 L L L只要满足是 3 3 3的倍数就行了,此时平方被我们去掉了。
如果 k ′ k' k是一个指数 p p p v v v次幂呢?

  • 如果v是偶数,比如 3 4 3^4 34,那么L只要是 3 2 3^2 32的倍数就行了;
  • 如果v是奇数,比如 3 5 3^5 35,那么L只要是 3 3 3^3 33的倍数就行了。

综上,L中至少要包含 p r p^r pr,其中 r = ⌈ e 2 ⌉ r=\left \lceil \dfrac{e}{2} \right \rceil r=2e
如果 k ′ k' k中包含多个质因数,则对每个质因数都按照上述方法求解即可,这样我们就可以得到 L L L至少是一个数的倍数的条件了,去掉了平方。
哈希表
在得到了上面的条件后, L L L必须是 k ′ k' k的倍数,那么会有什么情况出现呢?
现在的问题是,有多少个和为0的子数组,其长度是k’的倍数
对于一个子数组下标为 ( j , i ] (j,i] (j,i],长度 L = i − j L = i-j L=ij,若满足上述条件,有
( i − j ) m o d k ′ = 0 (i-j) \ mod\ k' = 0 (ij) mod k=0
则有
i m o d k ′ = j m o d k ′ i \ mod\ k' = j \ mod\ k' i mod k=j mod k
对前缀和来说,则有
s u m [ i ] − s u m [ j ] = 0 sum[i]-sum[j]=0 sum[i]sum[j]=0

s u m [ i ] = s u m [ j ] sum[i]=sum[j] sum[i]=sum[j]
当我们同时满足 i m o d k ′ = j m o d k ′ i \ mod\ k' = j \ mod\ k' i mod k=j mod k s u m [ i ] = s u m [ j ] sum[i]=sum[j] sum[i]=sum[j]的条件时,则这个子数组是美丽子数组,那么我们可以一起用哈希表维护这两个值。
哈希表的key就是一个pair: i m o d k ′ i \ mod\ k' i mod k s u m [ i ] sum[i] sum[i],哈希表的 value 是这个 pair 的出现次数。
注意:在最一开始需要加入一个pair: k ‘ − 1 , 0 {k‘-1,0} k1,0,因为我们的前缀维护时,下标为 0 0 0时,计算的是第二个前缀和,第一个前缀和(就是什么都没有的时候,和为 0 0 0)。相当于在下标为 − 1 -1 1的时候计算, − 1 -1 1 k ’ − 1 k’-1 k1同余,则最开始加入其中。
代码:

class Solution {
public:int get_base(int k){//分解质因子int ans = 1;for(int i = 2; i * i <= k; i++){int cnt = 0;while(k % i == 0){cnt++;k /= i;}ans *= pow(i, (cnt + 1)/ 2);}if(k > 1)ans *= k;return ans;}long long beautifulSubstrings(string s, int k) {//根据条件(L/2)^2 % k == 0 即 L^2 %(4k) == 0 先判断L要满足什么样的条件k = get_base(4 * k);map<pair<int, int>, int>cnt;int n = s.size();long long ans = 0;int sum = 0;//计算前缀 sum[-1] = 0 下标-1就是表示没有数字的时候的前缀和int flag = 1 | (1 << ('e' - 'a')) | (1 << ('i' - 'a')) | (1 << ('o' - 'a')) | (1 << ('u' - 'a'));cnt[{k - 1, 0}]++; //加入和-1同余的k-1,-1下标相当于前缀和数组中什么都没有的情况,此时前缀和为0for(int i = 0; i < n; i++){sum += ((1 << (s[i] - 'a')) & flag) > 0 ? 1 : -1;ans += cnt[{i % k, sum}]++;}return ans;}
};

时间复杂度: O ( n + k ) O(n+\sqrt k) O(n+k )
空间复杂度: O ( n ) O(n) O(n)

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

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

相关文章

JIRA部分数据库结构

表jiraissue&#xff08;问题表&#xff09; 字段 数据类型 是否为空 KEY 说明 ID decimal(18,0) NO PRI 主键 pkey varchar(255) YES MUL 查看主键&#xff0c;“项目ID” PROJECT decimal(18,0) YES MUL 项目外键&#xff0c;项目表外键 REPORTER varch…

【力扣】189. 轮转数组

【力扣】189. 轮转数组 文章目录 【力扣】189. 轮转数组1. 题目介绍2. 解法2.1 方法一&#xff1a;不太正规&#xff0c;但是简单2.2 方法二&#xff1a;使用额外的数组2.3 方法三&#xff1a;环状替换2.4 方法四&#xff1a;数组翻转 3. Danger参考 1. 题目介绍 给定一个整数…

社区新零售:重塑零售业的全新模式

社区新零售&#xff1a;重塑零售业的全新模式 近年来&#xff0c;新零售业成为了研究的焦点&#xff0c;它是一种以互联网为基础的零售形式。新零售通过运用先进技术手段&#xff0c;如大数据和人工智能&#xff0c;对商品的生产、流通和销售过程进行升级改造&#xff0c;重新构…

Android Camera Surface显示相关问题总结

1.默认创建的Preview Surface填充RGBA数据显示异常。 //界面创建的Surface format默认为4(RGB_565),而预览界面所需的格式是RGBA_8888 ANativeWindow_setBuffersGeometry(window, width, height, WINDOW_FORMAT_RGBA_8888); 2.调用ANativeWindow的dequeueBuffer出错&#xff…

系统入侵与提权

系统入侵与提权 一、信息搜集 1. 主机扫描 (1)扫描某个网段内存在的主机 (2)扫描主机开放的端口和服务 (3)扫描主机的操作系统和版本号 (4)扫描主机可能存在的已知漏洞 2. Web扫描 (1)查询域名和子域名信息 (2)查询whoid信息 (3)扫描Web应用的URL路径 (4)扫描Web应用后台管…

【实验记录】论文阅读(杂七杂八)

1.基于视觉语义路标的智能手机室内定位与建图研究_高煜昕 p19 介绍了智能终端的数据集ADVIO数据集&#xff0c;使用iPhone采集&#xff0c;针对视觉和惯导联合开发&#xff0c;具有描述真是复杂场景以及高质量真值的优点。 p20 论证了vins-mono、vins-fusion和orb-slam3等主流…

Go GORM简介

GORM&#xff08;Go Object-Relational Mapping&#xff09;是一个用于Go语言的ORM库&#xff0c;它提供了一种简单、优雅的方式来操作数据库。GORM支持多种数据库&#xff0c;包括MySQL、PostgreSQL、SQLite和SQL Server。以下是GORM的一些主要特性 全功能ORM&#xff1a;GORM…

提升企业网络安全的得力助手——EventLog Analyzer网络日志管理

在当今数字化时代&#xff0c;企业的网络安全问题变得尤为重要。为了更好地应对日益增多的威胁和安全漏洞&#xff0c;企业需要一种高效的网络日志管理工具&#xff0c;EventLog Analyzer便是其中一款卓越的解决方案。 EventLog Analyzer EventLog Analyzer是一款综合性的网络…

C#通过NPOI 读、写Excel数据;合并单元格、简单样式修改;通过读取已有的Excel模板另存为文件

文章目录 1 需要引用的DLL2 调用示例3 工具类 1 需要引用的DLL 2 调用示例 public static void WriteExcel() {string templateFile "F:\12312\excel.xlsx"; // 文件必须存在string outFile "F:\12312\" DateTime.Now.ToString("yyyyMMddHHmmssff…

逆向 tg 发送图片

开发工具 工具名称工具类型说明AndroidStuduo编辑工具开发工具jadxjava工具将apk解成java项目xposed插件工具插件tg版本9.7.5 分析源码的点&#xff1a; 发送图片的点 获取sendMessageParams 获取TLRPC$TL_photo 回调 实现 public void sendImg(String path, String…

NI自动化测试系统用电必备攻略,电源规划大揭秘

就像使用电脑之前需接通电源一样&#xff0c;自动化测试系统的电源选择也是首当其冲的问题&#xff0c;只不是这个问题更复杂。 比如&#xff0c;应考虑地理位置因素&#xff0c;因为不同国家或地区的公共电网所提供的线路功率有所不同。在电源布局和设备选型方面&#xff0c;有…

商城系统通过Kafka消息队列,实现订单的处理和状态更新

以下是一个简单的Spring Boot应用程序示例&#xff0c;演示如何使用Kafka实现订单的处理和状态更新。 首先&#xff0c;我们创建一个名为“order”的topic&#xff0c;在application.yaml配置文件中添加Kafka的配置&#xff1a; spring:kafka:bootstrap-servers: localhost:9…

每日一题(LeetCode)----哈希表--两个数组的交集

每日一题(LeetCode)----哈希表–两个数组的交集 1.题目&#xff08;[349. 两个数组的交集](https://leetcode.cn/problems/valid-anagram/)&#xff09; 给定两个数组 nums1 和 nums2 &#xff0c;返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出…

《深入理解计算机系统》学习笔记 - 第三课 - 位,字节和整型

Lecture 03 Bits,Bytes, and Integer count 位&#xff0c;字节&#xff0c;整型 文章目录 Lecture 03 Bits,Bytes, and Integer count 位&#xff0c;字节&#xff0c;整型运算&#xff1a;加&#xff0c;减&#xff0c;乘&#xff0c;除加法乘法取值范围乘法结果 使用无符号注…

Python Web包就业服务

还在等什么&#xff0c;加入我们&#xff0c;包就业

几何教学工具 Sketchpad几何画板 mac软件特色

Sketchpad几何画板 for Mac是一款适用于macOS系统的几何教学工具&#xff0c;用户可以在其画板上进行各种几何图形的绘制、演示&#xff0c;帮助教师了解学生的思路和对概念的掌握程度。此外&#xff0c;Sketchpad更深层次的功能则是可以用来进行几何交流、研究和讨论&#xff…

js手写面试题【附带注释】

文章目录 前言数组方法手写pushpopshiftunshiftcancatslicespliceforEachmapreducefind 手写订阅发布手写单例模式后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;javaScript &#x1f431;‍&#x1f453;博主在前端领域还有很多知识和…

代码安全-exe的代码签名和代码混淆加密

信息安全相关 - 建设篇 第四章 代码安全-exe的代码签名和代码混淆加密 信息安全相关 - 建设篇系列文章回顾代码安全-exe的代码签名和代码混淆加密前言实施步骤C#程序的程序集引用使用强命名(可选)Windows Server AD CA 制作自定义的证书模板,用于代码签名生成拥有自签名CA的代…

Java并发编程CAS

目录 CAS是什么 CAS存在问题 ABA问题 CPU开销大 不能保证代码块的原子性 CAS实例 CAS是什么 CAS(Compare and Swap,比较并交换)是一种并发编程中的原子操作,用于实现多线程环境下的无锁同步。它是一种乐观锁策略,通过比较内存中的值与期望值是否相等来决定是否更…