【LeetCode周赛】LeetCode第375场周赛

【LeetCode周赛】LeetCode第375场周赛

目录

  • 统计已测试设备(简单模拟题)
  • 双模幂运算(快速幂)
  • 统计最大元素出现至少 K 次的子数组(简单数学题)
  • 统计好分割方案的数目(合并区间+组合数学+快速幂)

统计已测试设备(简单模拟题)

统计已测试设备
分析:
本题数据范围较小,所以直接按照题目意思模拟即可,遍历一遍 b a t t e r y P e r c e n t a g e s batteryPercentages batteryPercentages数组,如果 b a t t e r y P e r c e n t a g e s [ i ] > 0 batteryPercentages[i] \gt 0 batteryPercentages[i]>0,则将 [ i + 1 , n − 1 ] [i+1,n-1] [i+1,n1]的所有设备电池百分比减1,即 b a t t e r y P e r c e n t a g e s [ j ] = m a x ( 0 , b a t t e r y P e r c e n t a g e s [ j ] − 1 ) batteryPercentages[j] = max(0, batteryPercentages[j] - 1) batteryPercentages[j]=max(0,batteryPercentages[j]1)。暴力即可解决。

代码:

class Solution {
public:int countTestedDevices(vector<int>& batteryPercentages) {int n = batteryPercentages.size();int ans = 0;for(int i = 0; i < n; i++){if(batteryPercentages[i] > 0){ans++;for(int j = i + 1; j < n; j++){batteryPercentages[j] = max(0, batteryPercentages[j] - 1);}}}return ans;}
};

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

双模幂运算(快速幂)

双模幂运算
分析:
根据题意,遍历 v a r i a b l e s variables variables数组,我们需要判断的是 ( ( a i b i % 10 ) c i ) % m i = = t a r g e t ((a_i^{b_i} \% 10)^{c_i}) \% m_i == target ((aibi%10)ci)%mi==target是否成立,又因为 1 ≤ a i , b i , c i , m i ≤ 1 0 3 1 \le a_i, b_i, c_i, m_i \le 10^3 1ai,bi,ci,mi103,如果直接去计算幂运算的话,时间复杂度为 O ( m 2 × n ) O(m^2 \times n) O(m2×n) m m m表示指数 b i , c i b_i,c_i bi,ci的最大值,这样时间复杂度过高,那么我们使用快速幂的方法。
对于 a b a^b ab来说,我们可以考虑将b拆分成二进制,以 2 11 2^{11} 211为例,11拆成二进制为 1011 1011 1011,即 8 + 2 + 1 8+2+1 8+2+1,那么 2 11 2^{11} 211可以拆分成 2 8 + 2 + 1 2^{8+2+1} 28+2+1 1 , 2 , 8 1,2,8 1,2,8分别就是二进制位中为 1 1 1的部分。这样来做运算,只需要 O ( log ⁡ b ) O(\log b) O(logb)的时间复杂度即可。具体操作见代码。

代码:

class Solution {
public:int ksm(int a, int b, int mod){int ans = 1, base = a;while(b){if(b & 1)ans = ans * base % mod;base = base * base % mod;b >>= 1;}return ans;}vector<int> getGoodIndices(vector<vector<int>>& variables, int target) {vector<int>ans;int n = variables.size();for(int i = 0; i < n; i++){int a = variables[i][0],b = variables[i][1], c = variables[i][2], m = variables[i][3];if(ksm(ksm(a, b, 10), c, m) == target) ans.push_back(i);}return ans;}
};

时间复杂度: O ( n log ⁡ ( max ⁡ ( b ) + max ⁡ ( c ) ) ) O(n \log(\max(b)+\max(c))) O(nlog(max(b)+max(c)))
空间复杂度: O ( n ) O(n) O(n)

统计最大元素出现至少 K 次的子数组(简单数学题)

统计最大元素出现至少 K 次的子数组
分析:
根据题意,满足条件的子数组就是其中需要包含 k k k个最大元素,所以我们首先求出最大元素是哪一个,并且得到最大元素所在的所有位置
对于一个有 k k k个最大元素的子数组,是可以任意拓展的,因为拓展是不会影响其满足题目要求的。
我们以数组 [ 2 , 1 , 3 , 2 , 3 , 2 , 3 ] , k = 2 [2,1,3,2,3,2,3],k=2 [2,1,3,2,3,2,3]k=2为例, 3 3 3所在的下标分别为 [ 2 , 4 , 6 ] [2,4,6] [2,4,6]
所以当下标为 [ 2 , 4 ] [2,4] [2,4]的最大数为一组时,这个子数组为, [ 3 , 2 , 3 ] [3,2,3] [3,2,3]是满足题意的,那么我可以再往左边扩展,可以是 [ 1 , 3 , 2 , 3 ] , [ 2 , 1 , 3 , 2 , 3 ] [1,3,2,3],[2,1,3,2,3] [1,3,2,3],[2,1,3,2,3]往右边扩展,可以是 [ 3 , 2 , 3 , 2 ] , [ 3 , 2 , 3 , 2 , 3 ] [3,2,3,2],[3,2,3,2,3] [3,2,3,2],[3,2,3,2,3],所以意思就是,以 [ 3 , 2 , 3 ] [3,2,3] [3,2,3]这个子数组拓展,其最左端点可以到0,最右端点可以到6,则总共有 ( 2 + 1 ) × ( 6 − 4 + 1 ) = 9 (2+1) \times (6-4+1) = 9 (2+1)×(64+1)=9种不同的满足题意的子数组。
所以对于任意一个包含 k k k个最大元素的子数组,其拓展后可以有 ( l + 1 ) × ( n − r ) (l+1) \times (n-r) (l+1)×(nr)个符合题意的子数组,( l l l是拓展前左端点, r r r是拓展前右端点, n n n为数组长度,因为下标从 0 0 0开始,所以不用减1)。
那么我们直接遍历所有包含 k k k个最大元素的子数组,对它进行拓展计算就可以了吗?不难发现,这样会有很多次重复的计算,比如对于上述例子,若选择下标为 [ 4 , 6 ] [4,6] [4,6]的最大数为一组时,其往左拓展到 [ 3 , 2 , 3 , 2 , 3 ] [3,2,3,2,3] [3,2,3,2,3]是被重复计算过的,所以,对于拓展后的右端点的计算,我们可以将右端点设置为,该区间的下一个最大元素的前一个位置,这样我们就不会将下一个最大元素包括进来,从而减少了这种重复的计算。
所以对于任意一个包含 k k k个最大元素的子数组,其拓展后可以有 ( l + 1 ) × ( r − i ) (l+1) \times (r-i) (l+1)×(ri)个符合题意的子数组, i i i表示当前的子数组的右边界。

代码:

class Solution {
public:long long countSubarrays(vector<int>& nums, int k) {//先找到每一个最大数的位置,然后对每k个最大数作为一组,每一组以上一组为左边界,下下一组为右边界,可以随意构造子数组int n = nums.size();int mx = *max_element(nums.begin(), nums.end());vector<int>pos;for(int i = 0; i < n; i++){if(nums[i] == mx) pos.push_back(i);}pos.push_back(n);//方便计算最后一个区间int cnt = 0;long long ans = 0;//左端点随便选,右端点选到下一组的左边for(int i = 0; i < n; i++){if(nums[i] == mx){cnt++;if(cnt >= k){int l = pos[cnt - k];int r = pos[cnt];//[0,l] [i + 1, r] 这些区间的数ans += (long long)(l + 1) * (r - i);}}}return ans;}
};

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

统计好分割方案的数目(合并区间+组合数学+快速幂)

统计好分割方案的数目
分析:
将数组分割成一个或多个连续子数组,如果不存在包含了相同数字的两个子数组,则认为是一种好分割方案。
所以题意就是,相同的数字必须在一个子数组中,然后来进行分割。
根据这一点,我们可以先计算出每一个数字出现的最左端点和最右端点,对于一个数字而言,这左右端点间的所有数肯定要在一个子数组中,才能满足题意。
那多个数字呢?
每一个数字都有一个区间 [ l , r ] [l,r] [l,r],表示其最左和最右出现的位置,那么我们要将所有数字的区间合并起来,合并后的区间,必须在一个子数组中
合并区间
所以现在的问题就变成了如何合并区间
首先统计每个数字出现的最左边和最右边位置,遍历一遍数组即可。
对于区间合并,可以采用差分数组的方式,对于每一个区间左端点 + 1 +1 +1,右端点 − 1 -1 1,所以只有 s u m = 0 sum=0 sum=0时,这个位置才是一个完整的区间。
合并区间后,剩下的若干个区间,相互之间不包含相同的数字。
组合数学
那么其实这些区间又可以任意连续的合并,合并后也是满足题意的分割方法。所以我们可以以插板法的方法来思考。
比如对于分好的区间 [ 3 ] , [ 1 , 2 , 1 ] , [ 4 ] [3],[1,2,1],[4] [3],[1,2,1],[4]
在中间有两个空隙,对这两个位置我们可以考虑插还是不插,一共有 2 2 2^2 22种方案,不插代表这相邻区间要合并,插则代表这相邻区间不合并
快速幂
所以计算区间数量 n u m num num,答案就是 2 n u m 2^{num} 2num,这里也使用快速幂,并取模。
代码:

const int mod = 1e9 + 7;
class Solution {
public:long long ksm(int a, int b){long long ans = 1, base = a;while(b){if(b & 1)ans = ans * base % mod;base = base * base % mod;b >>= 1;}return ans;}int numberOfGoodPartitions(vector<int>& nums) {//先分成若干个块,也就是说,所有相同的元素都在一个块中,在这个条件下,完成分块数量最多int n = nums.size();unordered_map<int, pair<int, int>>mp;for(int i = 0; i < n; i++){int x = nums[i];if(mp.count(x) == 0){mp[nums[i]] = {i, i};}else mp[nums[i]].second = i;}//根据所记录的每个数的最左边和最右边的位置,合并区间vector<int>cnt(n + 1, 0);for(auto &[_, v]: mp){int l = v.first, r = v.second;cnt[l]++, cnt[r] --;}int sum = 0, num = 0;for(int i = 0; i < n; i++){sum += cnt[i];if(sum == 0)num++;}return ksm(2, num - 1) % mod;}
};

时间复杂度: O ( n + log ⁡ n ) O(n + \log n) O(n+logn),最坏情况下是不同的数字,则区间有n个。
空间复杂度: O ( n ) O(n) O(n)

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

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

相关文章

Unity | Shader基础知识(第一集:unity中最简单的shader)

一、unity的shader unity写的shader并不是真正意义上的shader。 简单解释&#xff1a;真正的shader语言写起来还是麻烦的&#xff0c;unity希望大家写起来简单一点&#xff0c;于是在原来的基础上&#xff0c;给大家优化了一个语言&#xff0c;叫shaderLab&#xff0c;所以我…

四、编写第一个 Shell 脚本

一、编写 Shell 脚本内容 打开文本编辑器&#xff08;可以使用 vi/vim 命令来创建文件&#xff09;&#xff0c;新建一个文件 chaoqing.sh&#xff0c;扩展名为 sh &#xff08;sh 表示 shell&#xff09;&#xff0c;扩展名不影响脚本的运行。 输入一些代码&#xff0c;如下…

OpenHarmony应用编译 - 如何在源码中编译复杂应用

功能简介 在OpenHarmony系统中预安装应用的hap包会随系统编译打包到镜像中&#xff0c;目前有两种编译预安装应用hap包的方式&#xff0c;一种为随系统编译时&#xff0c;编译应用源码生成hap包的方式&#xff0c;另一种是将已生成的hap包放入系统源码中&#xff0c;再进行打包…

跨境电商如何利用跨境客服软件提升销售额

随着全球化的推进&#xff0c;跨境电商成为了许多企业拓展市场的重要途径。然而&#xff0c;跨境电商面临着语言、文化、时差等多种挑战&#xff0c;为了提供更好的客户服务并提升销售额&#xff0c;跨境电商需要利用跨境客服软件。本文将探讨跨境电商如何利用跨境客服软件来提…

HarmonyOS:NativeWindow 开发指导

场景介绍 NativeWindow 是 HarmonyOS 本地平台化窗口&#xff0c;表示图形队列的生产者端。开发者可以通过 NativeWindow 接口进行申请和提交 Buffer&#xff0c;配置 Buffer 属性信息。 针对 NativeWindow&#xff0c;常见的开发场景如下&#xff1a; ● 通过 NativeWindow…

Day35 贪心算法 part04

Day35 贪心算法 part04 860.柠檬水找零 pass 406.根据身高重建队列 pass

小航助学2023年9月电子学会Scratch一级真题(含题库答题软件账号)

需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09; 单选题2.00分 删除编辑附件图文 答案:C 第1题下列哪项内容是不可以修改的&#xff1f;&#xff08; &#xff09; A、角色名称B、造型名称C、舞台名称D、背景名…

SpringBoot使用注解实现参数校验

文章目录 参数校验- Validation- Hibernate Validator 校验注解注解通用属性- Validator 内置注解- Hibernate Validator 附加注解 校验开启Valid和Validated 校验分类- Controller校验- Spring Bean校验 校验使用- Controller&#xff1a;参数对象校验- Spring Bean&#xff1…

关系模式化的规范化理论

数据库规范化中的“函数依赖”是理解和应用规范化过程的关键概念。函数依赖描述了一个或多个列&#xff08;属性&#xff09;如何唯一确定另一个列的值。 函数依赖的基本概念&#xff1a; 函数依赖&#xff1a;如果在一个给定的关系中&#xff0c;对于某个属性集合 ( A ) 的每…

巧用RTL原语实现MUX门级映射

对于前端设计人员&#xff0c;经常会需要一个MUX来对工作模式&#xff0c;数据路径进行明确&#xff08;explicit&#xff09;的声明&#xff0c;这个对于中后端工程师下约束也很重要。这里介绍一种巧用的RTL原语&#xff0c;实现MUX的方法。闲言少叙&#xff0c;ICerGo&#x…

如何退回chrome旧版ui界面?关闭Chrome浏览器新 UI 界面

之前启用新UI的方式 Chrome 已经很久没有进行过大的样式修改&#xff0c;但近期在稳定分支中添加了新的 flags 实验性标志&#xff0c;带来了全新的设计与外观&#xff0c;启用方式如下&#xff1a; 在 Chrome 浏览器的搜索栏中输入并访问 chrome://flags 搜索“refresh 2023…

西南科技大学数字电子技术实验六(智力竞赛抢答器的设计及FPGA实现)预习报告

一、计算/设计过程 说明&#xff1a;本实验是验证性实验&#xff0c;计算预测验证结果。是设计性实验一定要从系统指标计算出元件参数过程&#xff0c;越详细越好。用公式输入法完成相关公式内容&#xff0c;不得贴手写图片。&#xff08;注意&#xff1a;从抽象公式直接得出结…

彻底解决公网ip无法访问服务器的问题

用服务器的公网ip访问突然提示页面无法访问了&#xff0c;之前还是ok的&#xff1a; 解决方案&#xff1a; 步骤1. 检查云服务器的安全组规则是否有添加80端口映射&#xff0c;如果没有需要手动添加&#xff0c;否则不能使用公网访问&#xff0c;检查了一下是有的&#xff1…

陵园殡仪馆网站建设的效果如何

陵园墓地的需求度众多周知非常高&#xff0c;无论墓地坑位咨询还是事项/环境展示、资料预览等都是常见事项&#xff0c;由于行业的特殊性&#xff0c;对正常客户来说&#xff0c;并不会知悉各个事项、价格、服务、流程等内容。 而对企业来说&#xff0c;也有获客、品牌扩张等需…

TCP/IP详解——网络基本概念

文章目录 一、网络基本概念1. OSI 7层模型1.1 每层对应的协议1.2 每层涉及的设备1.2.1 物理层设备1.2.2 数据链路层设备1.2.3 网络层设备1.2.4 传输层设备1.2.5 交换机和路由器的应用1.2.6 问题 2. TCP/IP 4层模型3. 物理层传输介质3.1 冲突域 4. 数据链路层4.1 以太网帧结构4.…

Ubuntu设置kubelet启动脚本关闭swap分区

查看swap分区 swapon -s打开swap分区 swapon -a查看/etc/fstab下所有固化的swap分区&#xff0c;注释 vi /etc/fstab修改kubelet.conf文件 vi /etc/systemd/system/kubelet.service.d/10-kubeadm.conf添加 ExecStartPre/sbin/swapoff -a生效 systemctl daemon-reload sys…

挑战52天学小猪佩奇笔记--day19

52天学完小猪佩奇--day19 ​【本文说明】 本文内容来源于对B站UP 脑洞部长 的系列视频 挑战52天背完小猪佩奇----day19 的视频内容总结&#xff0c;方便复习。强烈建议大家去关注一波UP&#xff0c;配合UP视频学习。 day19的主题&#xff1a;新鞋子 人物对话&#xff1a; 语境…

GPT-4V 在保险行业的应用

在科技的进步中&#xff0c;人工智能与大数据技术的结合产生了巨大的能量&#xff0c;推动了各行各业的创新与变革。OpenAI&#xff0c;作为全球领先的人工智能研发机构&#xff0c;在今年的9月25日&#xff0c;以一种崭新的方式&#xff0c;升级了其旗下的GPT-4模型。这次的升…

HNU计算机视觉作业一

前言 选修的是蔡mj老师的计算机视觉&#xff0c;上课还是不错的&#xff0c;但是OpenCV可能需要自己学才能完整把作业写出来。由于没有认真学&#xff0c;这门课最后混了80多分&#xff0c;所以下面作业解题过程均为自己写的&#xff0c;并不是标准答案&#xff0c;仅供参考 …

LeetCode力扣每日一题(Java):58、最后一个单词的长度

一、题目 二、解题思路 1、我的思路 先将字符串转换成字符数组 由于我们需要获取最后一个单词的长度&#xff0c;所以我们从后往前遍历字符数组 我们还需判断所遍历的字符是不是字母&#xff0c;即判断每个字符对应的ASCII值即可&#xff0c;用计数器count来储存单词长度 …