LeetCode --- 421周赛

题目列表

3334. 数组的最大因子得分

3335. 字符串转换后的长度 I

3336. 最大公约数相等的子序列数量

3337. 字符串转换后的长度 II

一、数组的最大因子得分

数据范围足够小,可以用暴力枚举移除的数字,得到答案,时间复杂度为O(n^2),代码如下

class Solution {
public:long long maxScore(vector<int>& nums) {int n = nums.size();auto get = [&](int i)->long long{// gcd(0, x) = x, lcm(1, x) = xlong long x = 0; // 计算 gcdlong long y = 1; // 计算 lcmfor(int j = 0; j < n; j++){if(i == j) continue;x = gcd(x, nums[j]);y = lcm(y, nums[j]);}return x * y;};long long ans = get(-1); // 不去除任何数字for(int i = 0; i < n; i++){ans = max(ans, get(i));}return ans;}
};

有没有更快的做法?我们同样枚举被移除的数字,有没有方法能更加快速的算出剩余数字的 LCM 和 GCD?有的,只要我们提前算出左右两个部分的 LCM 和 GCD,就能直接计算得出剩余部分的LCM 和 GCD,即进行前后缀分解,时间复杂度为O(n),代码如下

注意:上面的时间复杂度默认 LCM 和 GCD 是O(1),但实际上 GCD/LCM 的时间复杂度为O(logn)

class Solution {
public:long long maxScore(vector<int>& nums) {int n = nums.size();vector<long long> suf_gcd(n + 1), suf_lcm(n + 1, 1);// gcd(0, x) = x, lcm(1, x) = xfor(int i = n - 1; i >= 0; i--){suf_gcd[i] = gcd(suf_gcd[i + 1], nums[i]);suf_lcm[i] = lcm(suf_lcm[i + 1], nums[i]);}long long ans = suf_gcd[0] * suf_lcm[0]; // 不去除任何数long long pre_gcd = 0, pre_lcm = 1;for(int i = 0; i < n; i++){ // 同时计算 ans 和 前缀gcd/lcmans = max(ans, gcd(pre_gcd, suf_gcd[i + 1]) * lcm(pre_lcm, suf_lcm[i+1]));pre_gcd = gcd(pre_gcd, nums[i]);pre_lcm = lcm(pre_lcm, nums[i]);}return ans;}
};

二、字符串转换后的长度 I

这题的数据范围比较小,我们可以模拟 t 次转换的过程。对于任意一个字母,它的转换规则是一样的,所以我们先统计出 26 个字母出现的次数,然后根据规则,进行转换即可,代码如下

class Solution {const int MOD = 1e9 + 7;
public:int lengthAfterTransformations(string s, int t) {vector<int> cnt(26);for(auto e : s) cnt[e - 'a']++;while(t--){vector<int>tmp(26);for(int i = 0; i < 26; i++)tmp[i] = cnt[(i-1+26)%26]; // 如'a'的出现次数变成'b'的出现次数// 'z' 不仅能变成 'a' , 还能变成 'b'tmp[1] =(tmp[1] + cnt[25]) % MOD;swap(tmp, cnt);}int ans = 0;for(int i = 0; i < 26; i++) ans = (ans + cnt[i]) % MOD;return ans;}
};

但是一旦 t 的范围过大,就会超时,有没什么更快的方法?由于每个字母的转移方式是固定的,所以只要给定一个字母和操作次数就能得到一个长度,问题是如何加速这个计算过程?

假设f[i][j]表示字母 i (用0-25表示) 经过 j 次操作的长度,我们有如下方程

代码如下

class Solution {const int MOD = 1e9 + 7;// 矩阵快速幂vector<vector<int>> POW(vector<vector<int>> a, int n){int m = a.size();vector<vector<int>> res(m, vector<int>(m));for(int i = 0; i < m; i++) res[i][i] = 1;while(n){if(n & 1) res = mul(res, a);a = mul(a, a);n >>= 1;}return res;}// 矩阵相乘vector<vector<int>> mul(const vector<vector<int>>& a, const vector<vector<int>>& b){int n = a.size(), m = b[0].size();vector<vector<int>> c(n, vector<int>(m));for(int i = 0; i < n; i++){for(int k = 0; k < n; k++){if(a[i][k] == 0) continue;for(int j = 0; j < m; j++){c[i][j] = (c[i][j] + 1LL * a[i][k] * b[k][j]) % MOD;}}}return c;}
public:int lengthAfterTransformations(string s, int t) {int n = s.size();vector<vector<int>> mtx(26, vector<int>(26));for(int i = 0; i < 26; i++){mtx[i][(i+1)%26] = 1;}mtx[25][1] = 1;auto f = POW(mtx, t); // 矩阵的t次幂vector<int> cnt(26);for(auto e : s) cnt[e - 'a']++;long long ans = 0;for(int i = 0; i < 26; i++){ans += reduce(f[i].begin(), f[i].end(), 0LL) * cnt[i];}return ans % MOD;}
};

三、最大公约数相等的子序列数量

对于每一个数,都有三种可能,要么在seq1,要么在seq2,要么不选,一旦我们选择完一个数,对于剩下的数,我们依旧可以用相同的方法进行处理,大问题被划分为一个个小问题,进行解决。

设dfs(i,j,k)表示当seq1的gcd=j,seq2的gcd=k时,从前 i 个数中进行选择能得到的合法方案数

对于 nums[i]

  • 1、不选,方案数为 dfs(i-1,j,k)
  • 2、选入seq1,方案数为 dfs(i-1,gcd(j,nums[i]),k)
  • 3、选入seq2,方案数为 dfs(i-1,j,gcd(k,nums[i])) 

故状态转换方程为

dfs(i,j,k) = dfs(i-1,j,k) + dfs(i-1,gcd(j,nums[i]),k) + dfs(i-1,j,gcd(k,nums[i])) 

边界条件:当 i < 0 时,返回 j == k,表示将所有的数都进行分配后,如果seq1的gcd = seq2的gcd,则为一种合法方案数

代码如下

class Solution {const int MOD = 1e9 + 7;
public:int subsequencePairCount(vector<int>& nums) {int n = nums.size();int memo[n][201][201];memset(memo, -1, sizeof(memo));function<int(int,int,int)> dfs = [&](int i, int j, int k)->int{if(i < 0) return j == k;if(memo[i][j][k] != -1) return memo[i][j][k];int res = dfs(i - 1, j, k); // 不选res = (res + dfs(i - 1, gcd(j, nums[i]), k)) % MOD;res = (res + dfs(i - 1, j, gcd(k, nums[i]))) % MOD;return memo[i][j][k] = res;};// 注意我们的dfs会包含一种seq1和seq2都为空的方案,需要被减去// 由于取模操作 dfs(n - 1, 0, 0) - 1 可能为负数,所以要 + MOD) % MODreturn (dfs(n - 1, 0, 0) - 1 + MOD) % MOD;}
};

四、字符串转换后的长度 II

这题的思路同第二题,只是计算的矩阵不同,具体代码如下

class Solution {const int MOD = 1e9 + 7;// 矩阵快速幂vector<vector<int>> POW(vector<vector<int>> a, int n){int m = a.size();vector<vector<int>> res(m, vector<int>(m));for(int i = 0; i < m; i++) res[i][i] = 1;while(n){if(n & 1) res = mul(res, a);a = mul(a, a);n >>= 1;}return res;}// 矩阵相乘vector<vector<int>> mul(const vector<vector<int>>& a, const vector<vector<int>>& b){int n = a.size(), m = b[0].size();vector<vector<int>> c(n, vector<int>(m));for(int i = 0; i < n; i++){for(int k = 0; k < n; k++){if(a[i][k] == 0) continue;for(int j = 0; j < m; j++){c[i][j] = (c[i][j] + 1LL * a[i][k] * b[k][j]) % MOD;}}}return c;}
public:int lengthAfterTransformations(string s, int t, vector<int>& nums) {int n = s.size();vector<vector<int>> mtx(26, vector<int>(26));for(int i = 0; i < 26; i++){for(int j = i + 1; j <= i + nums[i]; j++){mtx[i][j%26] = 1;}}auto f = POW(mtx, t);vector<int> cnt(26);for(auto e : s) cnt[e - 'a']++;long long ans = 0;for(int i = 0; i < 26; i++){ans += reduce(f[i].begin(), f[i].end(), 0LL) * cnt[i];}return ans % MOD;}
};

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Linux下Java的多种方式安装

Linux下Java的多种方式安装 博客&#xff1a; www.lstar.icu 开源地址 Gitee 地址&#xff1a; https://gitee.com/lxwise/iris-blog_parent Github 地址&#xff1a; https://github.com/lxwise/iris-blog_parent 序言 Java是一门面向对象的编程语言&#xff0c;不仅吸收了…

易灵思fpga pwm生成报错

避免复杂总线 选择正确板子 这个是是全部执行 但是不会自动保存 注意设置 或者使用其他文本显示工具 可能约束会掉 注意复位后没有程序 注意软件不同电脑可能报错 问题未知 尽量简单逻辑

JavaEE初阶--servlet篇(三)HttpServlet/response/request对应方法使用

文章目录 1.总括说明2.httpservlet父类2.1方法介绍2.2dopost方法的演示2.3doput方法的演示 3.HttpServletRequest类3.1方法说明3.2方法使用演示3.3getparameter方法使用3.4使用form表单的方式3.5jackson获取参数 4.HttpResponse类4.1设置状态码4.2自动进行刷新4.3重定向跳转4.3…

矩阵起源 CEO 王龙出席 1024 超互联(苏州)总部节点发布会

10月24日&#xff0c;矩阵起源 CEO & 创始人王龙出席了由中关村超互联新基建产业创新联盟、数字人民币研究院联合主办&#xff0c;世纪互联承办的“超互联&#xff08;苏州&#xff09;总部节点发布会”&#xff0c;并分享了矩阵起源及世纪互联在多模态AI数据智能平台与超互…

大数据-202 数据挖掘 机器学习理论 - 决策树 sklearn 绘制决策树 防止过拟合

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

LTE及EPC技术原理(笔记)

无线网络发展历史 20世纪80年代&#xff1a;模拟技术和FDMA 20世纪90年代&#xff1a;数字技术和TDMA 21世纪初&#xff1a;数字技术和CDMA LTE进步 下行100Mbps&#xff0c;上行50Mbps 用户面时延10-20ms&#xff0c;控制面时延小于100ms 带宽从1.4MHz~20MHz&#xff0…

域用户账户与域组账户管理实战

Windows Server 通过建立账户(包括用户账户和组账户)并赋予账户合适的权限&#xff0c;保证使用网络和计算机资源的合法性&#xff0c;以确保数据访问、存储和交换服从安全需要。 如果是单纯的工作组模式的网络&#xff0c;需要使用“计算机管理”工具来管理本地用户和组&#…

C++类与对象(中)

类的默认成员函数 1. 默认成员函数&#xff0c;就是用户没有去显式实现&#xff0c;而编译器会自动生成的成员函数。 2. 对于⼀个类&#xff0c;一般情况下&#xff0c;编译器会默认生成6个默认成员函数。我们主要学习前面4个默认成员函数&#xff0c;对于后面两个默认成员函数…

HFSS 3D Layout中Design setting各个选项的解释

从HFSS 3D LAYOUT菜单中&#xff0c;选择Design Settings打开窗口&#xff0c;会有六个选项&#xff1a;DC Extrapolation, Nexxim Options, Export S Parameters, Lossy Dielectrics, HFSS Meshing Method, and HFSS Adaptive Mesh. DC Extrapolation 直流外推 直流外推分为标…

Python绘制爱心

文章目录 系列目录写在前面技术需求完整代码代码分析写在后面 系列目录 序号直达链接爱心系列1Python制作一个无法拒绝的表白界面2Python满屏飘字表白代码3Python无限弹窗满屏表白代码4Python李峋同款可写字版跳动的爱心5Python流星雨代码6Python漂浮爱心代码7Python爱心光波代…

C++ | Leetcode C++题解之第538题把二叉搜索树转换为累加树

题目&#xff1a; 题解&#xff1a; class Solution { public:TreeNode* getSuccessor(TreeNode* node) {TreeNode* succ node->right;while (succ->left ! nullptr && succ->left ! node) {succ succ->left;}return succ;}TreeNode* convertBST(TreeNo…

Linux基础命令(十)之 压缩命令 zip,gzip,bzip2,xz,tar

目录 一&#xff0c;zip和unzip 常见用法 二&#xff0c;gzip和ungzip命令 常见用法 三&#xff0c;bzip2和bunzip2命令 常见用法 四&#xff0c;xz和unxz命令 常见用法 五&#xff0c;归档命令tar 参数及其作用 常见用法 一&#xff0c;zip和unzip 语法&#xff1a;…

已解决,部署GPTSoVITS报错‘AsyncRequest‘ object has no attribute ‘_json_response_data‘

部署GPTSoVITS过程中&#xff0c;开启一键三连进程发生&#xff0c;报错AsyncRequest object has no attribute _json_response_data 具体报错内容为 (GPTSoVITS) PS D:\Code\GPT-SoVITS-beta0706> python webui.py Running on local URL: http://0.0.0.0:9874 IMPORTANT:…

ISUP协议视频平台EasyCVR视频融合平台接入各类摄像机的方法

安防视频监控ISUP协议视频平台EasyCVR兼容性强、支持灵活拓展&#xff0c;平台可提供视频远程监控、录像、存储与回放、视频转码、视频快照、告警、云台控制、语音对讲、平台级联等视频能力。 想要将摄像机顺利接入EasyCVR平台&#xff0c;实现视频监控的集中管理和分发&#x…

to_sql报错not all arguments converted during string formatting

报错&#xff1a; DatabaseError: Execution failed on sql SELECT name FROM sqlite_master WHERE typetable AND name?;: not all arguments converted during string formattingb 报错的代码如下&#xff1a; import pymysql import pandas as pd con pymysql.connect(…

7.机器学习--K-means算法(聚类)

聚类分析是在没有给定划分类别的情况下&#xff0c;根据数据相似度进行样本分组的一种方法。与分类模型需要使用有类标记样本构成的训练数据不同&#xff0c;聚类模型可以建立在无类标记的数据上&#xff0c;是一种非监督的学习算法。 聚类的输入是一组未被标记的样本&#xff…

GPIO子系统层次与数据结构详解

往期内容 本专栏往期内容&#xff1a; Pinctrl子系统和其主要结构体引入Pinctrl子系统pinctrl_desc结构体进一步介绍Pinctrl子系统中client端设备树相关数据结构介绍和解析inctrl子系统中Pincontroller构造过程驱动分析&#xff1a;imx_pinctrl_soc_info结构体Pinctrl子系统中c…

干货丨通信网络与大模型的融合与协同

本文首发《中兴通讯技术》&#xff0c;2024年4月&#xff0c;第30卷第2期&#xff0c;作者&#xff1a;浙江大学在读本科生任天骐&#xff0c;浙江大学信息与电子工程学院副教授李荣鹏&#xff0c;浙江大学兼任教授、博士生导师张宏纲。边缘计算社区经过授权发布&#xff0c;以…

[ vulnhub靶机通关篇 ] 渗透测试综合靶场 DarkHole:1 通关详解 (附靶机搭建教程)

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

对于一个STM32外设的应用有哪一些?可以列举一个实际的设计案例吗?

STM32 具有丰富的外设&#xff0c;以下是一些常见的应用&#xff1a; 1. **GPIO&#xff08;通用输入输出&#xff09;**&#xff1a; - 控制 LED 灯的亮灭。 - 读取按键状态。 - 与外部数字设备进行通信&#xff0c;如驱动数码管。 2. **USART&#xff08;通用同步异步收发器…