LeetCode --- 434周赛

目录

3432. 统计元素和差值为偶数的分区方案
3433. 统计用户被提及情况
3434. 子数组操作后的最大频率
3435. 最短公共超序列的字母出现频率

一、统计元素和差值为偶数的分区方案

统计元素和差值为偶数的分区方案
本题可以直接模拟,当然我们也可以来从数学的角度来分析一下这题的本质

S S S 为数组之和, L L L [ 0 , i ] [0,i] [0,i] 的区间和,则 S − L S-L SL [ i + 1 , n − 1 ] [i+1,n-1] [i+1,n1] 的区间和,对于任意的 i i i,左右子数组的区间和差值为 L − ( S − L ) = 2 L − S L-(S-L)=2L-S L(SL)=2LS,题目问有几个 i i i 2 L − S 2L-S 2LS 为偶数,显然 2 L − S 2L-S 2LS 是否为偶数只和 S S S 有关,当 S S S 为偶数时, 2 L − S 2L-S 2LS 总是为偶数。

故本题的答案是固定的,要么所有的 2 L − S 2L-S 2LS 都是偶数,有 n − 1 n-1 n1 个,要么都不为偶数,有 0 0 0 个,代码如下

class Solution {
public:int countPartitions(vector<int>& nums) {int n = nums.size();int s = accumulate(nums.begin(),nums.end(), 0);return s % 2 ? 0 : n - 1;}
};

二、统计用户被提及情况

统计用户被提及情况
本题是一个纯模拟题,关键在于如何统计每个用户被提及的次数,而这取决于该用户是否在线。这里我们可以记录每一个用户的最近一次的在线时间,在用它和消息发送的时间进行比较,从而判断出当前消息是否提及该用户,代码如下

class Solution {
public:vector<int> countMentions(int numberOfUsers, vector<vector<string>>& events) {// cnt 统计答案,online 记录每个用户最近一次上线时间vector<int> cnt(numberOfUsers), online(numberOfUsers);// 按时间顺序排序,注意:题目要求离线操作优先级更高ranges::sort(events, [](const auto& x, const auto & y){int tx = stoi(x[1]), ty = stoi(y[1]);return tx != ty ? tx < ty : x[0][0] == 'O';});for(auto e : events){int time = stoi(e[1]);if(e[0][0] == 'O'){online[stoi(e[2])] = time + 60; // 跟新最新上线时间}else if(e[2][0] == 'A'){for(auto& x : cnt) x++;}else if(e[2][0] == 'H'){for(int i = 0; i < numberOfUsers; i++){if(online[i] <= time){cnt[i]++;}}}else{string t;for(stringstream ss(e[2]); ss >> t; cnt[stoi(t.substr(2))]++);}}return cnt;}
};

三、子数组操作后的最大频率

子数组操作后的最大频率
本题题意为我们可以将任意区间内值为 x x x 的数变为 k k k,返回进行一次操作后, k k k 出现的最大频率。显然,我们要分 3 3 3 个部分统计 k k k 的出现次数

  • 假定我们让 [ l , r ] [l,r] [l,r] 内的 x x x 全部变为 k k k
  • k k k 的出现次数 = [ 0 , l ) =[0,l) =[0,l) 内的 k k k 的次数 + [ l , r ] +[l,r] +[l,r] 内的 x x x 的出现次数 + ( r , n ) +(r,n) +(r,n) 内的 k k k 的出现次数

思路:

  1. 由于 n u m s nums nums 中数字范围为 1 1 1~ 50 50 50,所以我们可以暴力枚举需要改变的数字 x x x
  2. 子数组相关的问题,可以考虑用动态规划来思考
    • f [ i ] [ 0 ] f[i][0] f[i][0] 表示当 i i i 处于 [ 0 , l ) [0,l) [0,l) 中时, [ 0 , i ] [0,i] [0,i] k k k 的最大出现次数
    • f [ i ] [ 1 ] f[i][1] f[i][1] 表示当 i i i 处于 [ l , r ] [l,r] [l,r] 中时, [ 0 , i ] [0,i] [0,i] k k k 的最大出现次数
    • f [ i ] [ 2 ] f[i][2] f[i][2] 表示当 i i i 处于 ( r , n ) (r,n) (r,n) 中时, [ 0 , i ] [0,i] [0,i] k k k 的最大出现次数
  • f [ i ] [ 0 ] = f [ i − 1 ] [ 0 ] + ( n u m s [ i ] = = k ) f[i][0] = f[i-1][0]+(nums[i]==k) f[i][0]=f[i1][0]+(nums[i]==k),因为 i ∈ [ 0 , l ) i\in[0,l) i[0,l),则 i − 1 ∈ [ 0 , l ) i-1\in[0,l) i1[0,l),所以它只能由自己转移来
  • f [ i ] [ 1 ] = m a x ( f [ i − 1 ] [ 0 ] , f [ i − 1 ] [ 1 ] ) + ( n u m s [ i ] = = x ) f[i][1] = max(f[i-1][0],f[i-1][1])+(nums[i]==x) f[i][1]=max(f[i1][0],f[i1][1])+(nums[i]==x),因为 i ∈ [ l , r ] i\in[l,r] i[l,r],则 i − 1 ∈ [ l , r ] i-1\in[l,r] i1[l,r] 或者 i − 1 = l − 1 i-1=l-1 i1=l1,所以它可以由 f [ i − 1 ] [ 0 ] f[i-1][0] f[i1][0] f [ i − 1 ] [ 1 ] f[i-1][1] f[i1][1] 转移来
  • f [ i ] [ 2 ] = m a x ( f [ i − 1 ] [ 1 ] , f [ i − 1 ] [ 2 ] ) + ( n u m s [ i ] = = k ) f[i][2] = max(f[i-1][1],f[i-1][2])+(nums[i]==k) f[i][2]=max(f[i1][1],f[i1][2])+(nums[i]==k),因为 i ∈ ( r , n ) i\in(r,n) i(r,n),则 i − 1 ∈ ( r , n ) i-1\in(r,n) i1(r,n) 或者 i − 1 = r i-1=r i1=r,所以它可以由 f [ i − 1 ] [ 0 ] f[i-1][0] f[i1][0] f [ i − 1 ] [ 1 ] f[i-1][1] f[i1][1] 转移来

代码如下

class Solution {// 0 1 2// f[i][j] 表示 i 为 j 状态时,k 出现的最大频率// j = 0, f[i][0] = f[i-1][0] + nums[i] == k// j = 1, f[i][1] = max(f[i-1][1], f[i-1][0]) + nums[i] == x// j = 2, f[i][2] = max(f[i-1][2], f[i-1][1]) + nums[i] == k
public:int maxFrequency(vector<int>& nums, int k) {int n = nums.size();set<int> st(nums.begin(), nums.end());int ans = 0;for(auto x : st){vector<array<int, 3>> f(n + 1);for(int i = 0; i < n; i++){f[i+1][0] = f[i][0] + (nums[i] == k);f[i+1][1] = max(f[i][1], f[i][0]) + (nums[i] == x);f[i+1][2] = max(f[i][2], f[i][1]) + (nums[i] == k);}// 注意:答案只可能在 f[n][1] 或者 f[n][2] 中,因为修改数字总比不修改数字更优ans = max({ans, f.back()[1], f.back()[2]});}return ans;}
};// 空间优化
class Solution {
public:int maxFrequency(vector<int>& nums, int k) {int n = nums.size();set<int> st(nums.begin(), nums.end());int ans = 0;for(auto x : st){int f[3]{};for(int i = 0; i < n; i++){f[2] = max(f[2], f[1]) + (nums[i] == k);f[1] = max(f[1], f[0]) + (nums[i] == x);f[0] = f[0] + (nums[i] == k);}ans = max({ans, f[1], f[2]});}return ans;}
};

四、最短公共超序列的字母出现频率

最短公共超序列的字母出现频率
在这里插入图片描述
由于 w o r d s [ i ] . l e n g t h = = 2 words[i].length==2 words[i].length==2,所以对于任意字符来说,只要它的出现次数为 2,则可以组成任意一个包含该字符的 w o r d word word前提是我们将出现了两次的字符都对称的放在两侧,比如字符 a 、 b a、b ab,如果我们的公共超序列为 a b c d e b a abcdeba abcdeba,则 a b 、 a c 、 a d 、 a e 、 b a 、 c a 、 d a 、 e a 、 a a ab、ac、ad、ae、ba、ca、da、ea、aa abacadaebacadaeaaa 所有包含 a a a 的组合都能得到,同理 b b b 也是一样

  • 简单的证明如下
  • 对于字符串 a ∗ ∗ ∗ ∗ ∗ a a*****a aa,显然能组成任意包含字符 a a a 的长度为 2 2 2 的子序列
  • 对于字符串 a b ∗ ∗ ∗ b a ab***ba abba,去掉字符 a a a 后得字符串 b ∗ ∗ ∗ b b***b bb,显然能组成任意包含 b b b 的长度为 2 2 2 的子序列,除了 a b 、 b a ab、ba abba,但是我们在计算字符 a a a 的组合时,已经计算过 a b 、 b a ab、ba abba 了,故我们能得出包含字符 a a a b b b 的任意组合的长度为 2 2 2 的子序列
  • 当字符串为 a b c ∗ ∗ ∗ c b a 、 a b c d ∗ ∗ ∗ d c b a 、 . . . abc***cba、abcd***dcba、... abccbaabcddcba... 时,同上
  • 通过数学归纳法,得出结论:如果给定的一个或多个字符的个数为 2 2 2,则我们可以通过上述的构造形式,得到长度为 2 2 2 的包含这些字符的所有子序列组合

所以最短公共超序列中每个字符的出现次数要么为 1 1 1,要么为 2 2 2。而 w o r d s words words 中最多只有 16 16 16 种不同的字符,我们可以枚举每种字符的出现次数的所有可能情况。 ( ( (最多有 2 16 2^{16} 216种可能 ) ) )

故我们的问题变为判断每种情况是否合法,即是否满足题目要求。根据上面的结论,我们只要关心出现一次的字符即可。
比如对于 a b c abc abc 这样的最短公共超序列,如果 w o r d s = { a b 、 b c 、 c a } words =\{ab、bc、ca \} words={abbcca},则不能满足条件,因为一个 a a a 不能同时出现在 c c c 的两边,我们可以将 w o r d s words words 抽象成一个有向图,其中 a b ab ab 表示 a → b a\rightarrow b ab 这样一条边,我们只要判断对于出现次数为 1 1 1 的字符,在 w o r d s words words 抽象成的有向图中是否有环即可。如果有环则不合法,反之,则合法 。

代码如下

class Solution {
public:vector<vector<int>> supersequences(vector<string>& words) {int n = words.size();vector<vector<int>> g(26);int all = 0; // 用 bit 位是否为 1,表示字符是否出现过for(auto s : words){int x = s[0] - 'a', y = s[1] - 'a';all |= (1 << x) | (1 << y);g[x].push_back(y);}auto has_cycle = [&](int sub)->bool{int color[26]{};// 判断是否有环auto dfs = [&](this auto&& dfs, int x)->bool{color[x] = 1;for(int y : g[x]){if(sub >> y & 1) // 只关注出现次数为 1 次的字符continue;if(color[y] == 1 || color[y] == 0 && dfs(y))return true;}color[x] = 2;return false;};// 有向图不一定连通,所以要字符都要遍历一遍for(int i = 0; i < 26; i++){if(color[i] == 0 && (sub >> i & 1) == 0 && dfs(i)) // 只关注出现次数为 1 次的字符return true;}return false;};unordered_set<int> st;int min_size = INT_MAX;int sub = all; // sub 中用 bit 位是否为 1,表示字符是否出现了 2 次// 遍历字符的出现次数的所有可能情况do{int size = __builtin_popcount((unsigned) sub);if(size <= min_size && !has_cycle(sub)){if(size < min_size){min_size = size;st.clear();}st.insert(sub);}sub = all & (sub - 1);}while(sub != all);// 记录答案vector<vector<int>> ans;for(int sub : st){vector<int> cnt(26);for(int i = 0; i < 26; i++){cnt[i] = (all >> i & 1) + (sub >> i & 1);}ans.push_back(cnt);}return ans;}
};

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

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

相关文章

如何安全地管理Spring Boot项目中的敏感配置信息

在开发Spring Boot应用时&#xff0c;我们经常需要处理一些敏感的配置信息&#xff0c;比如数据库密码、API密钥等。以下是一个最佳实践方案&#xff1a; 1. 创建配置文件 application.yml&#xff08;版本控制&#xff09; spring:datasource:url: ${MYSQL_URL:jdbc:mysql…

我主编的电子技术实验手册(24)——RL并联电路

本专栏是笔者主编教材&#xff08;图0所示&#xff09;的电子版&#xff0c;依托简易的元器件和仪表安排了30多个实验&#xff0c;主要面向经费不太充足的中高职院校。每个实验都安排了必不可少的【预习知识】&#xff0c;精心设计的【实验步骤】&#xff0c;全面丰富的【思考习…

【贪心算法篇】:“贪心”之旅--算法练习题中的智慧与策略(三)

✨感谢您阅读本篇文章&#xff0c;文章内容是个人学习笔记的整理&#xff0c;如果哪里有误的话还请您指正噢✨ ✨ 个人主页&#xff1a;余辉zmh–CSDN博客 ✨ 文章所属专栏&#xff1a;贪心算法篇–CSDN博客 文章目录 前言例题1.最优除法2.跳跃游戏23.跳跃游戏14.加油站5.单调递…

2024年度十大网络安全热点事件盘点:时代暗涌下的安全危机

2024年&#xff0c;国际形势风云变幻&#xff0c;地缘政治的动荡与科技革命的浪潮交织成一幅复杂图景。以人工智能为代表的前沿科技突飞猛进&#xff0c;正以前所未有的速度重塑着世界的每一个角落&#xff0c;引领着人类社会迈向一个更加智能、高效与便捷的未来。 然而&#…

【教程】禁止网页右键和打开调试页面

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 普通页面&#xff0c;可以右键&#xff0c;并打开调试页面。不安全&#xff1a; 在网页中添加一下JavaScript代码&#xff0c;可以禁止网页右键和打开调…

使用开源项目:pdf2docx,让PDF转换为Word

pdf2docx&#xff1a;GitCode - 全球开发者的开源社区,开源代码托管平台 环境&#xff1a;windows电脑 1.安装python Download Python | Python.org 最好下载3.8以上的版本 安装时记得选择上&#xff1a;Add ... Path 安装时默认会装pip等工具&#xff0c;因此下载安装包时…

电控---中断

中断 1.处理器系统在执行代码的时候&#xff0c;会从存储器依次取出指令和数据&#xff0c;这种能力需要在处理器里保存一个存储器地址&#xff0c;就是所谓的程序计数器&#xff08;Program Counter,PC&#xff09;&#xff0c;也叫程序指针 2.当外部中断&#xff08;Extern …

编程AI深度实战:大模型哪个好? Mistral vs Qwen vs Deepseek vs Llama

​​ 系列文章&#xff1a; 编程AI深度实战&#xff1a;私有模型deep seek r1&#xff0c;必会ollama-CSDN博客 编程AI深度实战&#xff1a;自己的AI&#xff0c;必会LangChain-CSDN博客 编程AI深度实战&#xff1a;给vim装上AI-CSDN博客 编程AI深度实战&#xff1a;火的编…

计算机视觉-边缘检测

一、边缘 1.1 边缘的类型 ①实体上的边缘 ②深度上的边缘 ③符号的边缘 ④阴影产生的边缘 不同任务关注的边缘不一样 1.2 提取边缘 突变-求导&#xff08;求导也是一种卷积&#xff09; 近似&#xff0c;1&#xff08;右边的一个值-自己可以用卷积做&#xff09; 该点f(x,y)…

【高级篇 / IPv6】(7.2) ❀ 05. 在60E上配置ADSL拨号宽带上网(IPv6) ❀ FortiGate 防火墙

【简介】上一篇文章了解了如何在60E上配置ADSL拨号IPv4上网&#xff0c;这篇文章将介绍如何在FortiGate上配置IPv6&#xff0c;使得内网电脑都能以IPv6地址上网。 启用IPv6 由于IPv6比较小众&#xff0c;默认在防火墙是看不到的。 ① 接上一篇文章&#xff0c;由于Internal已经…

可视化大屏在石油方面的应用。

可视化大屏通过整合石油工业全链条数据&#xff0c;构建数字孪生驱动的运营监控体系&#xff0c;显著提升油气勘探、开采、储运及炼化的管理效能。其技术架构依托工业物联网&#xff08;IIoT&#xff09;实时采集钻井参数、管道压力、储罐液位等数据&#xff0c;通过OPC UA协议…

Vim的基础命令

移动光标 H(左) J(上) K(下) L(右) $ 表示移动到光标所在行的行尾&#xff0c; ^ 表示移动到光标所在行的行首的第一个非空白字符。 0 表示移动到光标所在行的行首。 W 光标向前跳转一个单词 w光标向前跳转一个单词 B光标向后跳转一个单词 b光标向后跳转一个单词 G 移动光标到…

modbus协议处理

//------------------------0x01-------------------------------- //MDA_usart_send: aa 55 01 00 06 00 02 00 05 //转modbusTCP——Master——send&#xff1a;地址00002&#xff0c;寄存器数量&#xff1a;00005 00 00 00 00 00 06 01 01 00 02 00 05 //ModbusTCP——Slave…

实验十 Servlet(一)

实验十 Servlet(一) 【实验目的】 1&#xff0e;了解Servlet运行原理 2&#xff0e;掌握Servlet实现方式 【实验内容】 1、参考课堂例子&#xff0c;客户端通过login.jsp发出登录请求&#xff0c;请求提交到loginServlet处理。如果用户名和密码相同则视为登录成功&#xff0c…

RK3566-移植5.10内核Ubuntu22.04

说明 记录了本人使用泰山派&#xff08;RK3566&#xff09;作为平台并且成功移植5.10.160版本kernel和ubuntu22.04&#xff0c;并且成功配置&连接网络的完整过程。 本文章所用ubuntu下载地址&#xff1a;ubuntu-cdimage-ubuntu-base-releases-22.04-release安装包下载_开源…

实现基础的shell程序

1. 实现一个基础的 shell 程序&#xff0c;主要完成两个命令的功能 cp 和 ls 1.1.1. cp 命令主要实现&#xff1a; ⽂件复制⽬录复制 1.1.2. ls 命令主要实现&#xff1a; ls -l 命令的功能 1.1. 在框架设计上&#xff0c;采⽤模块化设计思想&#xff0c;并具备⼀定的可扩…

计算机网络 应用层 笔记 (电子邮件系统,SMTP,POP3,MIME,IMAP,万维网,HTTP,html)

电子邮件系统&#xff1a; SMTP协议 基本概念 工作原理 连接建立&#xff1a; 命令交互 客户端发送命令&#xff1a; 服务器响应&#xff1a; 邮件传输&#xff1a; 连接关闭&#xff1a; 主要命令 邮件发送流程 SMTP的缺点: MIME&#xff1a; POP3协议 基本概念…

Java 数据库连接池:HikariCP 与 Druid 的对比

Java 数据库连接池&#xff1a;HikariCP 与 Druid 的对比 数据库连接池&#xff1a;HikariCP 1. 卓越的性能表现 HikariCP 在数据库连接池领域以其卓越的性能脱颖而出。 其字节码经过精心优化&#xff0c;减少了不必要的开销&#xff0c;使得连接获取和释放的速度极快。 在…

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.25 视觉风暴:NumPy驱动数据可视化

1.25 视觉风暴&#xff1a;NumPy驱动数据可视化 目录 #mermaid-svg-i3nKPm64ZuQ9UcNI {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-i3nKPm64ZuQ9UcNI .error-icon{fill:#552222;}#mermaid-svg-i3nKPm64ZuQ9UcNI …

【实践案例】基于大语言模型的海龟汤游戏

文章目录 项目背景提示词构建海龟汤主持人真相判断专家 具体实现流程文心一言大语言模型“海龟汤”插件参考 项目背景 “海龟汤”作为一种聚会类桌游&#xff0c;又称情境推理游戏&#xff0c;是一种猜测情境还原事件真相的智力游戏。其玩法是由出题者提出一个难以理解的事件&…