LeetCode --- 399周赛

题目列表

3162. 优质数对的总数 I

3163. 压缩字符串 III

3164. 优质数对的总数 II

3165. 不包含相邻元素的子序列的最大和

一、优质数对的总数I

这里由于数据范围比较小,我们可以直接暴力枚举,代码如下

class Solution {
public:int numberOfPairs(vector<int>& nums1, vector<int>& nums2, int k) {int ans = 0;for(auto x:nums1){for(auto y:nums2){ans += x%(y*k)==0;}}return ans;}
};

二、压缩字符串III

这题也是简单的模拟题,只要统计连续出现的字符个数,将它们拼接称字符串即可,但是要注意一旦连续出现的次数大于十,我们就需要将它进行拆分,比如有20个连续的a,拼接的字符串不能是20a,而应该是9a9a2a,代码如下

class Solution {
public:string compressedString(string word) {string ans;int i = 0, n = word.size();while(i < n){int j = i++;while(i < n && word[j] == word[i])i++;int m = i - j; // 字符word[j]连续出现的个数while(m >= 10){ans += '9';ans += word[j];m -= 9;}if(m) ans += to_string(m) + word[j];}return ans;}
};

三、优质数对的总数II

题目和第一题相同,但是数据范围被扩大了,不能暴力枚举了,该如何做?

题目要求nums1[i]%k*nums2[j]==0的数对个数,我们有两种思路:

1、枚举统计nums1数组元素的因子有哪些,然后遍历统计nums2[j]*k占了多少

2、枚举统计nums2数组元素*k的倍数有哪些,然后统计nums1数组元素占了多少

两种方法都可以,在代码中我们会算它们的时间复杂度

代码如下

class Solution {// 1、枚举统计nums1数组元素的因子有哪些,然后遍历统计nums2[j]*k占了多少
public:// 时间复杂度 O(n*sqrt(U/k) + m) U = max(nums1)long long numberOfPairs(vector<int>& nums1, vector<int>& nums2, int k) {unordered_map<int,int> mp;// O(n*sqrt(U/k)) U = max(nums1)for(auto x:nums1){if(x%k) continue; // 首先必须是k的倍数x /= k;for(int i = 1; i*i <= x; i++){if(x%i) continue;mp[i]++;if(i*i!=x) mp[x/i]++;}}// O(m)long long ans = 0;for(auto x:nums2){ans += mp.count(x)?mp[x]:0;}return ans;}
};class Solution {// 2、枚举统计nums2数组元素*k的倍数有哪些,然后遍历统计nums1[i]占了多少
public:// 时间复杂度 O(n+m+U*logm) U = max(nums1)long long numberOfPairs(vector<int>& nums1, vector<int>& nums2, int k) {unordered_map<int,int> cnt1, cnt2, mp;int u = INT_MIN;for(auto x:nums1){u = max(u, x);if(x%k) continue;cnt1[x/k]++;}if(cnt1.empty()) return 0;for(auto x:nums2){cnt2[x]++;}// 看着像是O(n^2)的时间复杂度// 最坏的情况是nums2的元素全都不重复// 为1,2,3,....,mx  共有m个数//  U/1 + U/2 + U/3 + ... + U/mx//= U*(1+1/2+1/3+...+1/mx)//= U*logm// 1+1/2+1/3+...+1/mx 调和级数的极限,可以直接求1/x的积分,为logx// O(U*logm)long long ans = 0;for(auto [x,c]:cnt2){int s = 0;for(int i = x; i <= u;i += x){s += cnt1.count(i)?cnt1[i]:0;}ans += (long long)s*c;}return ans;}
};

四、不包含相邻元素的子序列的最大和

这题单独只看求不相邻元素的子序列最大和,是一道标准的打家劫舍问题,建议没写过的先去写一写,如果写过的话,其实很容易想到它可以用动态规划来做,然后你就会开始想如何进行优化,代码如下

class Solution {const int MOD = 1e9+7;
public:int maximumSumSubsequence(vector<int>& nums, vector<vector<int>>& q) {int n = nums.size(), m = q.size();int ans = 0;vector<long long> dp(n+2);for(int i=0;i<n;i++){dp[i+2] = max(dp[i]+nums[i],dp[i+1]);}for(auto v:q){int pos = v[0], x = v[1];nums[pos] = x;bool flag = false;for(int i=pos;i<n;i++){dp[i+2] = max(dp[i]+nums[i],dp[i+1]);}ans = (ans%MOD + dp.back()%MOD)%MOD;}return ans;}
};

但实际上这题用动态规划来写是不行的,会超时,可以去试试(java的除外,java给的时间比较宽松,官方应该会调整,这里暂且不论)。

那么这题该如何去做呢?注意,题目进行的是单点更新,区间查询的操作,显然很适合用线段树来做,那么能不能呢?这里就需要考虑一个问题:打家劫舍问题能不能用分治来做?思路如下

代码如下

// 线段树
class Solution {const int MOD = 1e9 + 7;vector<array<unsigned int,4>> t;// f00,f01,f10,f11//   0,  1,  2,  3void maintain(int o){auto& a = t[o<<1], b = t[o<<1|1];t[o] = {max(a[0]+b[2], a[1]+b[0]), // 00 = max 00+10 01+00max(a[0]+b[3], a[1]+b[1]), // 01 = max 00+11 01+01max(a[2]+b[2], a[3]+b[0]), // 10 = max 10+10 11+00max(a[2]+b[3], a[3]+b[1]) // 11 = max 10+11 11+01};}void build(vector<int>&nums,int o,int l,int r){if(l == r){// 当只有一个元素时,根据状态定义,只有f11是可以进行选择的为max(0,nums[l]),其余都无法选择为0t[o][3] = max(0,nums[l]);return;}int mid = (l+r)>>1;build(nums, o<<1, l, mid);build(nums, o<<1|1, mid + 1, r);maintain(o);}void update(int o,int l,int r,int i,int val){if(l == r){t[o][3] = max(val,0);return;}int mid = (l+r)>>1;if(i<=mid){update(o<<1,l,mid,i,val);}else{update(o<<1|1,mid+1,r,i,val);}maintain(o);}
public:int maximumSumSubsequence(vector<int>& nums, vector<vector<int>>& queries) {int n = nums.size();t.resize(2<<(32 - __builtin_clz(n)));build(nums, 1, 0, n - 1);long long ans = 0;for(auto&q:queries){update(1, 0, n - 1, q[0], q[1]);ans += t[1][3];}return ans%MOD;}
};

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

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

相关文章

5292A 物联网信号分析仪

5292A 物联网信号分析仪 —— 10MHz&#xff5e;6GHz —— 简述 5292A物联网信号分析仪是一款通用的矢量信号分析仪&#xff0c;频率范围覆盖 10MHz&#xff5e;6GHz&#xff0c;具有良好的频率、功率测量精度和稳定度&#xff1b;支持模拟与数字调制信号、全制式的通信标准…

【错误记录】HarmonyOS 运行报错 ( Failure[MSG_ERR_INSTALL_FAILED_VERIFY_APP_PKCS7_FAIL] )

文章目录 一、报错信息二、问题分析二、解决方案 一、报错信息 在 DevEco Studio 中 , 运行程序 , 编译时正常编译 , 但是在真机运行时 , 报如下错误 , 核心报错信息是 " Failure[MSG_ERR_INSTALL_FAILED_VERIFY_APP_PKCS7_FAIL] " ; 完整报错信息 : 05/29 10:58:55…

【机器学习300问】104、残差网络是怎么起作用的?

残差网络&#xff08;Residual Network&#xff0c;简称ResNet&#xff09;诞生是为了解决深度神经网络的训练困难性问题。深度神经网络在图像分类等任务上取得了重大突破&#xff0c;但随着网络层数的增加&#xff0c;训练变得更加困难。 一、神经网络深度过深会出现…

用docker搭建的Vulfocus镜像管理界面没有镜像可以拉取解决办法

ps&#xff1a;截止到今天2023.4.2&#xff0c;kali和vps的docker拉取的vulfocus镜像会有版本的区别&#xff0c;虽然都是拉取的最新版&#xff0c;vps上镜像为3个月以前&#xff0c;kali上为16个月以前&#xff0c;所以在修改 views.py 文件时&#xff0c;可能会发现文件内容不…

国家首批20个“数据要素×”典型案例发布,珈和科技助力金融、气象两案例入榜

5月24日&#xff0c;国家数据局会同生态环境部、交通运输部、金融监管总局、中国科学院、中国气象局、国家文物局、国家中医药局等部门在第七届数字中国峰会主论坛上发布首批20个“数据要素”典型案例。 其中&#xff0c;珈和科技以其专业的产品和服务助力金融服务领域的浙江网…

GDPU 操作系统 天码行空13

文章目录 ❌ TODO&#xff1a;本文仅供参考&#xff0c;极有可能有误1.生产者消费者问题&#xff08;信号量&#xff09;&#x1f496; ProducerConsumerExample.java&#x1f3c6; 运行结果 &#x1f496; ProducerConsumerSelectiveExample.java&#x1f3c6; 运行结果 2.实现…

【UnityShader入门精要学习笔记】第十五章 使用噪声

本系列为作者学习UnityShader入门精要而作的笔记&#xff0c;内容将包括&#xff1a; 书本中句子照抄 个人批注项目源码一堆新手会犯的错误潜在的太监断更&#xff0c;有始无终 我的GitHub仓库 总之适用于同样开始学习Shader的同学们进行有取舍的参考。 文章目录 使用噪声上…

【JS基础语法04】运算符分类以及运用

一&#xff1a;赋值运算符 1 类型 赋值运算符包括以下&#xff1a;、、-、*、/ 2 原理 &#xff0c;是将等号右边的数赋值给左边以为例(-、*、/和运算逻辑是相同的) let num 5 num2 等价于 let num 5 numnum2 //num7 二&#xff1a;一元运算符 1怎么判断运算符是几元…

多条文本转二维码怎么做?一键批量建码的使用技巧

怎么快速的制作多条文本信息的二维码&#xff1f;随着二维码的广泛使用&#xff0c;现在很多内容都可以通过生成二维码扫码的方式来获取信息&#xff0c;其他文本二维码就是比较常用的一种类型。那么当需要将多条不同的文本内容每条单独生成二维码时&#xff0c;有什么方法可以…

【Uniapp微信小程序】自定义水印相机、微信小程序地点打卡相机

效果图 template 下方的image图片自行寻找替换! <template><view><camerav-if="!tempImagePath && cameraHeight !== 0":resolution="high":frame-size="large":device-position="device":flash="flas…

2台倍福PLC ADS通信配置

倍福PLC的入门应用介绍请参考下面文章链接: 1、倍福PLC简单入门 从零开始倍福TwinCAT 3 PLC 的一个简单项目-CSDN博客文章浏览阅读34次。这篇文章我们介绍如何开始一个简单的倍福PLC项目。https://rxxw-control.blog.csdn.net/article/details/139124427 1、配置路由 2、…

笔记92:离散LQR控制器详细推导

1&#xff09;离散LQR的推导原理&#xff1a; 拉格朗日乘子法都是在等式约束下用的&#xff1b; 对这个性能函数J运用拉格朗日乘子法后&#xff0c;得到的函数是二次型函数&#xff08;即转化为了最优化控制问题&#xff09;&#xff0c;二次型函数只有一个极值点而且是极小值点…

机器视觉分析在加油站安全中的应用:使用手机检测、打电话行为识别

在加油站等高危场所&#xff0c;禁止使用手机是为了防止潜在的火灾和爆炸风险。手机在使用过程中可能产生电火花&#xff0c;而在加油站这种易燃易爆环境中&#xff0c;任何电火花都可能引发严重的安全事故。因此&#xff0c;加油站禁止使用手机是保障安全生产的重要措施。基于…

FDW(Foreign Data Wrapper)

在上一篇博客里&#xff0c;最末尾提到了 FDW。 FDW 到底是什么呢&#xff1f; 标准 FDW&#xff08;Foreign Data Wrapper&#xff09;遵循了 SQL/MED 标准&#xff0c;标准全称&#xff1a;ISO/IEC 9075-9 Management of External Data (SQL/MED) 2003 年&#xff0c;SQL…

小程序内的分包与数据共享

一:数据共享 小程序内的数据共享和vue当中不一样,vue当中的vue实例可以使得所有的组件都能this.store 但是小程序它只有page对象,和组件实例对象.对于vue而言,vue实例可以使得添加的组件都有. 但是page对象页面对象,不能使得页面内部有.只能使得这个页面内能访问.vue实例,会…

Pooling Sequencing

1、混合(Pooling)样本测序研究 https://www.jianshu.com/p/19ce438ccccf 1.1 混合测序基础 测序成本虽然下降了,但对于植物育种应用研究来说还是很高,动不动就上百群体,小小植物个体价值又低,测完了很可能后面就用不到了。这时,混合样本测序是一种省钱的好办法。 混池…

使用PyAutoGUI识别PNG图像并自动点击按钮

在自动化测试、任务批处理等场景中,我们常常需要控制GUI程序的鼠标键盘操作。PyAutoGUI就是一个非常方便的Python模块,可以帮助我们实现这些操作。今天我们就来看看如何使用PyAutoGUI识别屏幕上的PNG图像,并自动点击图像所在位置。 C:\pythoncode\new\autoguirecongnizepng.py …

超结MOS在全桥电路上的应用-REASUNOS瑞森半导体

一、前言 全桥电路定义 全桥电路是一种常见的电子电路&#xff0c;由四个开关管和一个负载组成&#xff0c;可将直流电转换为交流电。 全桥电路的应用领域 全桥电路广泛应用于电力电子领域&#xff0c;如开关电源、变频器、逆变器、电动汽车、工业自动化等领域 。在电路中&…

Make-An-Audio——用于语音生成的提示增强扩散模型

0.引言 论文提出了一个从文本生成语音的扩散模型 Make-An-Audio。该模型将文本提示作为输入&#xff0c;并据此生成语音。例如&#xff0c;输入 “一只猫在喵喵叫&#xff0c;一个年轻女人的声音”&#xff0c;就会输出猫在喵喵叫&#xff0c;一个女人在说话的音频。这项研究已…

RET-CLIP:眼科疾病诊断大模型

RET-CLIP&#xff1a;眼科疾病诊断大模型 RET-CLIP模型的工作流程和架构图表组成部分工作流程 精细拆解应用RET-CLIP模型进行糖尿病视网膜病变分级 论文&#xff1a;http://arxiv.org/pdf/2405.14137v1 代码&#xff1a;https://github.com/sStonemason/RET-CLIP RET-CLIP 是…