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,一经查实,立即删除!

相关文章

JavaScript字符串方法

charAt() 方法&#xff1a;返回指定索引处的字符。 示例&#xff1a; let str "Hello World"; console.log(str.charAt(0)); // Output: "H" console.log(str.charAt(6)); // Output: "W"charCodeAt() 方法&#xff1a;返回指定索引处字符的 Un…

数组321

package demo; public class Goodtest { public static void main(String[] args) { Good arr[]new Good[3]; Good g1new Good("001","小米",5990,100); Good g2new Good("002","保温杯",227,100); Good g3new G…

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…

vue 微信公众号H5页面截取长图并分享给朋友

截图&#xff1a;使用dom-to-image 或者 html2canvas 分享&#xff1a;可以使用右上角分享 或者 自定义分享wx.updateAppMessageShareData 截图dom-to-image 并分享 请注意&#xff0c;dom-to-image库在将DOM元素转换为图片时可能不会包括所有的CSS样式&#xff0c;因为它是基于…

【机器学习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;珈和科技以其专业的产品和服务助力金融服务领域的浙江网…

享元模式具体实例(含代码)

学习目标&#xff1a; 了解享元模式 学习内容&#xff1a; 享元模式&#xff08;Flyweight Pattern&#xff09;在现实生活中可以用来优化资源的使用&#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…

JDBC基础知识

JDBC&#xff08;Java Database Connectivity&#xff09;是Java应用程序与数据库之间的连接API。它定义了一套标准&#xff0c;使得Java应用程序能够访问各种关系型数据库。JDBC API提供了许多方法&#xff0c;使得开发人员可以使用Java代码来连接数据库、执行SQL语句、处理查…

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;加油站禁止使用手机是保障安全生产的重要措施。基于…

Unity3D 基于ECS的技能冷却系统设计与实现详解

前言 ECS&#xff08;Entity-Component-System&#xff09;是一种新的游戏开发架构&#xff0c;它将游戏对象分解为实体&#xff08;Entity&#xff09;、组件&#xff08;Component&#xff09;和系统&#xff08;System&#xff09;&#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…