Leetcode - 周赛434

目录

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

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

题目链接
在这里插入图片描述
本题可以直接模拟,这里再介绍一个数学做法,假设 n u m s [ : i ] nums[:i] nums[:i] 的和为 L L L n u m s [ : ] nums[:] nums[:] 的和为 S S S,那么 n u m s [ i + 1 : ] nums[i+1:] nums[i+1:] 的和为 S − L S-L SL,题目要求满足 a b s ( L − ( S − L ) ) abs(L-(S-L)) abs(L(SL)) 为偶数,化简一下得到 2 ∗ L − S 2*L-S 2LS,可以发现差值是否为偶数和怎么划分无关,只和 S S S 有关,而 S S S 是固定的(数组的和),所以只要 S S S 为偶数,那么方案数为 l e n ( n u m s ) − 1 len(nums)-1 len(nums)1,否则方案数为 0 0 0

代码如下:

class Solution {public int countPartitions(int[] nums) {int s = 0;for(int x : nums){s += x;}return s%2 == 0 ? nums.length-1 : 0;}
}
//模拟做法
class Solution {public int countPartitions(int[] nums) {int n = nums.length;int s = 0;for(int x : nums){s += x;}int ans = 0;int p = 0;for(int i=0; i<n-1; i++){int x = nums[i];p += x;if((s-p-p)%2 == 0)ans++;}return ans;}
}

二、3433. 统计用户被提及情况

题目链接
在这里插入图片描述
本题就是一道模拟题,唯一要注意的就是在排序的时候,如果离线事件和消息时间同时发生,优先处理离线事件。

代码如下:

class Solution {public int[] countMentions(int n, List<List<String>> events) {int[] ans = new int[n];Collections.sort(events, (x, y)->{int t = Integer.parseInt(x.get(1))-Integer.parseInt(y.get(1));return t==0?y.get(0).compareTo(x.get(0)):t;    });//使用time数组记录每个用户下一次上线的时间int[] time = new int[n];for(List<String> x : events){String s = x.get(0);int t = Integer.parseInt(x.get(1));String y = x.get(2);if(s.equals("MESSAGE")){if(y.equals("ALL")){for(int i=0; i<n; i++){ans[i]++;}}else if(y.equals("HERE")){for(int i=0; i<n; i++){if(time[i] <= t){ans[i]++;}}}else{for(String c : y.split(" ")){int j = Integer.parseInt(c.substring(2));ans[j]++;}}}else{for(String c : y.split(" ")){int j = Integer.parseInt(c);time[j] = t + 60;}}}return ans;}
}

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

题目链接
在这里插入图片描述
本题可以将 n u m s nums nums 数组分成三个部分:被修改的子数组的左边,被修改的子数组,被修改的子数组的右边,考虑将 n u m s nums nums 中等于 t a r g e t target target 的元素变成 k k k,我们可以定义以下三种状态:

  • f [ i + 1 ] [ 0 ] f[i+1][0] f[i+1][0]:表示被修改的子数组的左边,即统计 n u m s [ : i ] nums[:i] nums[:i] 中等于 k k k 的元素个数。
  • f [ i + 1 ] [ 1 ] f[i+1][1] f[i+1][1]:表示被修改的子数组 + 左边,即被修改的子数组以 i i i 结尾时 k k k 出现的最大频率。
  • f [ i + 1 ] [ 2 ] f[i+1][2] f[i+1][2]:表示被修改的子数组 + 左边 + 右边,即被修改的子数组以 < i < i <i 的下标结尾时 k k k 出现的最大频率。
  • 注:这三种状态都表示 n u m s [ : i ] nums[:i] nums[:i] k k k 出现的最大频率,只不过表示的范围不同!!!
  • 显然,假设被修改子数组的范围是 [ i , j ] [i,j] [i,j] j j j 当然可以是 n − 1 n-1 n1,也可以是 < n − 1 < n-1 <n1,所以 a n s = m a x ( a n s , f [ n ] [ 1 ] , f [ n ] [ 2 ] ) ans=max(ans,f[n][1],f[n][2]) ans=max(ans,f[n][1],f[n][2])

从左到右遍历 n u m s nums nums,设 x = n u m s [ i ] x = nums[i] x=nums[i],考虑转移来源:

  • 【左】只能从【左】转移过来, f [ i + 1 ] [ 0 ] f[i+1][0] f[i+1][0] 只能从 f [ i ] [ 0 ] f[i][0] f[i][0] 转移过来,即 f [ i + 1 ] [ 0 ] = f [ i ] [ 0 ] + ( x = = k ? 1 : 0 ) f[i+1][0] = f[i][0]+(x==k?1:0) f[i+1][0]=f[i][0]+(x==k?1:0),(PS:实际上就是计算 k k k 的出现次数,可以使用一个变量来表示)
  • 【左 + 中】可以从【左】或者【左 + 中】转移过来,如果 x = = t a r g e t x == target x==target f [ i + 1 ] [ 1 ] = m a x ( f [ i ] [ 0 ] , f [ i ] [ 1 ] ) + 1 f[i+1][1]=max(f[i][0],f[i][1])+1 f[i+1][1]=max(f[i][0],f[i][1])+1,此时如果从 f [ i ] [ 0 ] f[i][0] f[i][0] 转移过来表示被修改子数组从 i i i 位置开始;如果从 f [ i ] [ 1 ] f[i][1] f[i][1] 转移过来表示 n u m s [ i − 1 ] nums[i-1] nums[i1] 也在被修改子数组中。如果 x ! = t a r g e t x != target x!=target f [ i + 1 ] [ 1 ] = m a x ( f [ i ] [ 0 ] , f [ i ] [ 1 ] ) f[i+1][1]=max(f[i][0],f[i][1]) f[i+1][1]=max(f[i][0],f[i][1])
  • 【左 + 中 + 右】可以从【左 + 中】或者【左 + 中 + 右】转移过来,如果 x = = k x == k x==k f [ i + 1 ] [ 1 ] = m a x ( f [ i ] [ 1 ] , f [ i ] [ 2 ] ) + 1 f[i+1][1]=max(f[i][1],f[i][2])+1 f[i+1][1]=max(f[i][1],f[i][2])+1,此时如果从 f [ i ] [ 1 ] f[i][1] f[i][1] 转移过来表示 n u m s [ i − 1 ] nums[i-1] nums[i1] 是被修改子数组的最后一个元素;如果从 f [ i ] [ 2 ] f[i][2] f[i][2] 转移过来表示被修改子数组的最后下标 < i − 1 <i-1 <i1

代码如下:

class Solution {public int maxFrequency(int[] nums, int k) {Set<Integer> set = new HashSet<>();for(int x : nums) set.add(x);int n = nums.length;int ans = 0;for(int tar : set){int[][] f = new int[n+1][3];for(int i=0; i<n; i++){int x = nums[i];f[i+1][0] = f[i][0] + (x == k ? 1 : 0);f[i+1][1] = Math.max(f[i][0], f[i][1]) + (x == tar ? 1 : 0);f[i+1][2] = Math.max(f[i][1], f[i][2]) + (x == k ? 1 : 0);}ans = Math.max(ans, Math.max(f[n][1], f[n][2]));}return ans;}
}
//化简之后
class Solution {public int maxFrequency(int[] nums, int k) {Set<Integer> set = new HashSet<>();for(int x : nums) set.add(x);int n = nums.length;int ans = 0;for(int tar : set){int f0 = 0, f1 = 0, f2 = 0;for(int x : nums){f2 = Math.max(f1, f2) + (x == k ? 1 : 0);f1 = Math.max(f0, f1) + (x == tar ? 1 : 0);f0 = f0 + (x == k ? 1 : 0);}ans = Math.max(ans, Math.max(f1, f2));}return ans;}
}

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

题目链接
在这里插入图片描述
举一个例子 w o r d s = [ a a , a b , a c , a d , b a , c a ] words=[aa,ab,ac,ad,ba,ca] words=[aa,ab,ac,ad,ba,ca],至少需要几个 a a a 才能满足所有排列,答案是两个,只需要将 a a a 放在两端,我们就可以直接得出 a ∗ a* a a a aa aa ∗ a *a a,(即关于 a a a 的所有排列),对于其它字符也是同理,可以得出一个结论:对于 w o r d s words words 中出现的字符,它要么出现一次,要么出现两次。又因为本题在一个 w o r d s words words 中至多出现16个不同字符,所以可以暴力枚举 w o r d s words words 中不同字符出现的次数来解决这道题。

接下来问题就变成了如何判断这些字符是否有一种排列能满足 w o r d s words words 中的所有字符串是它的子序列:

  • 由上述的推导可知,如果一个字符出现了 2 次,只要放在两端一定可以得到关于它的任意排列,所以这里只需要考虑出现 1 次的字符。
  • 对于只出现 1 次的字符,比如说 abcd 四个字符各出现了一次,如果 w o r d s words words 中有 ab 和 ba,那么不管怎么排列都不可能满足条件,如果把它当成一个有向图,a -> b -> a,也就是说对于只出现 1 次的字符不能出现环,如果出现环,就说明这个字符需要出现 2 次才能满足条件。
  • 判断有向图是否有环可以有两种做法:拓扑排序、三色标记法

代码如下:

//拓扑排序
class Solution {public List<List<Integer>> supersequences(String[] words) {int all = 0;//统计出现了那些字符for(String s : words){int x = s.charAt(0) - 'a';int y = s.charAt(1) - 'a';all |= 1 << x | 1 << y;}Set<Integer> set = new HashSet<>();int minSize = Integer.MAX_VALUE;int sub = all;//枚举哪些字符出现2次do{int size = Integer.bitCount(sub);if(size <= minSize && !hasCycle(sub, words)){if(size < minSize){minSize = size;set.clear();}set.add(sub);}sub = (sub - 1) & all;}while(sub != all);List<List<Integer>> ans = new ArrayList<>(set.size());for(int s : set){List<Integer> cnt = new ArrayList<>();for(int i=0; i<26; i++){cnt.add((all>>i&1)+(s>>i&1));}ans.add(cnt);}return ans;}private boolean hasCycle(int sub, String[] words){List<Integer>[] g = new ArrayList[26];Arrays.setAll(g, e->new ArrayList<>());int[] cnt = new int[26];for(String s : words){int x = s.charAt(0) - 'a';int y = s.charAt(1) - 'a';if((sub>>x&1)==0 && (sub>>y&1)==0){g[x].add(y);cnt[y]++;}}Queue<Integer> que = new LinkedList<>();for(int i=0; i<26; i++){if(cnt[i] == 0) que.add(i);}while(!que.isEmpty()){int poll = que.poll();for(int x : g[poll]){if(--cnt[x] == 0)que.add(x);}}for(int x : cnt){if(x > 0) return true;}return false;}
}
//三色标记法
class Solution {public List<List<Integer>> supersequences(String[] words) {int all = 0;List<Integer>[] g = new ArrayList[26];Arrays.setAll(g, e->new ArrayList<>());for(String s : words){int x = s.charAt(0) - 'a';int y = s.charAt(1) - 'a';all |= 1 << x | 1 << y;g[x].add(y);}Set<Integer> set = new HashSet<>();int minSize = Integer.MAX_VALUE;int sub = all;do{int size = Integer.bitCount(sub);if(size <= minSize && !hasCycle(sub, g)){if(size < minSize){minSize = size;set.clear();}set.add(sub);}sub = (sub - 1) & all;}while(sub != all);List<List<Integer>> ans = new ArrayList<>(set.size());for(int s : set){List<Integer> cnt = new ArrayList<>();for(int i=0; i<26; i++){cnt.add((all>>i&1)+(s>>i&1));}ans.add(cnt);}return ans;}private boolean hasCycle(int sub, List<Integer>[] g){int[] color = new int[26];for(int i=0; i<26; i++){if(color[i]==0&&(sub>>i&1)==0&&dfs(i, color, g, sub)){return true;}}return false;}private boolean dfs(int x, int[] color, List<Integer>[] g, int sub){color[x] = 1;for(int y : g[x]){if((sub>>y&1)!=0){continue;}if(color[y]==1 || color[y]==0 && dfs(y, color, g, sub)){return true;}}color[x] = 2;return false;}
}

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

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

相关文章

Linux: 网络基础

1.协议 为什么要有协议&#xff1a;减少通信成本。所有的网络问题&#xff0c;本质是传输距离变长了。 什么是协议&#xff1a;用计算机语言表达的约定。 2.分层 软件设计方面的优势—低耦合。 一般我们的分层依据&#xff1a;功能比较集中&#xff0c;耦合度比较高的模块层…

Spring Boot常用注解深度解析:从入门到精通

今天&#xff0c;这篇文章带你将深入理解Spring Boot中30常用注解&#xff0c;通过代码示例和关系图&#xff0c;帮助你彻底掌握Spring核心注解的使用场景和内在联系。 一、启动类与核心注解 1.1 SpringBootApplication 组合注解&#xff1a; SpringBootApplication Confi…

【大模型理论篇】DeepSeek-R1:引入冷启动的强化学习

1. 背景 首先给出DeepSeek-V3、DeepSeek-R1-Zero、DeepSeek-R1的关系图【1】。 虽然DeepSeek-R1-Zero推理能力很强&#xff0c;但它也面临一些问题。例如&#xff0c;DeepSeek-R1-Zero存在可读性差和语言混杂等问题。为了使推理过程更具可读性&#xff0c;进而推出了DeepSee…

【BUUCTF杂项题】荷兰宽带数据泄露、九连环

一.荷兰宽带数据泄露 打开发现是一个.bin为后缀的二进制文件&#xff0c;因为提示宽带数据泄露&#xff0c;考虑是宽带路由器方向的隐写 补充&#xff1a;大多数现代路由器都可以让您备份一个文件路由器的配置文件&#xff0c;软件RouterPassView可以读取这个路由配置文件。 用…

院校联合以项目驱动联合培养医工计算机AI人才路径探析

一、引言 1.1 研究背景与意义 在科技飞速发展的当下&#xff0c;医疗人工智能作为一个极具潜力的新兴领域&#xff0c;正深刻地改变着传统医疗模式。从疾病的早期诊断、个性化治疗方案的制定&#xff0c;到药物研发的加速&#xff0c;人工智能技术的应用极大地提升了医疗服务…

解读“大语言模型(LLM)安全性测评基准”

1. 引入 OWASP&#xff0c;全称为Open Web Application Security Project&#xff0c;即开放式Web应用程序安全项目&#xff0c;是一个致力于提高软件安全性的非营利国际组织。 由于庞大的规模和复杂的结构&#xff0c;大语言模型也存在多种安全风险&#xff0c;如prompt误导…

【大数据技术】教程03:本机PyCharm远程连接虚拟机Python

本机PyCharm远程连接虚拟机Python 注意:本文需要使用PyCharm专业版。 pycharm-professional-2024.1.4VMware Workstation Pro 16CentOS-Stream-10-latest-x86_64-dvd1.iso写在前面 本文主要介绍如何使用本地PyCharm远程连接虚拟机,运行Python脚本,提高编程效率。 注意: …

Notepad++消除生成bak文件

设置(T) ⇒ 首选项... ⇒ 备份 ⇒ 勾选 "禁用" 勾选禁用 就不会再生成bak文件了 notepad怎么修改字符集编码格式为gbk 如图所示

CSS布局(一)flex一篇搞定

目录 一、flex布局 1.1. 认识flex布局 1.2. flex布局重要的概念 二、flex container中的属性 2.1.flex-direction 2.2.flex-wrap、flex-flow 2.3.justify-content 2.4.align-items 2.5.align-content 三、 flex item中的属性 3.1.order 3.2.align-self 3.3.flex-gr…

e2studio开发RA2E1(5)----GPIO输入检测

e2studio开发RA2E1.5--GPIO输入检测 概述视频教学样品申请硬件准备参考程序源码下载新建工程工程模板保存工程路径芯片配置工程模板选择时钟设置GPIO口配置按键口配置按键口&Led配置R_IOPORT_PortRead()函数原型R_IOPORT_PinRead()函数原型代码 概述 本篇文章主要介绍如何…

[吾爱出品]CursorWorkshop V6.33 专业鼠标光标制作工具-简体中文汉化绿色版

CursorWorkshop V6.33 专业鼠标光标制作工具 链接&#xff1a;https://pan.xunlei.com/s/VOIFeq5DFB9FS56Al_mT2EfdA1?pwd7ij4# 产品概述 Axialis CursorWorkshop 是一个专业光标创作工具它在 Windows 下运行&#xff0c;让您轻松创建高质量的静态和动态光标适用于 Windows …

STM32单片机学习记录(2.2)

一、STM32 13.1 - PWR简介 1. PWR&#xff08;Power Control&#xff09;电源控制 &#xff08;1&#xff09;PWR负责管理STM32内部的电源供电部分&#xff0c;可以实现可编程电压监测器和低功耗模式的功能&#xff1b; &#xff08;2&#xff09;可编程电压监测器&#xff08;…

【物联网】ARM核常用指令(详解):数据传送、计算、位运算、比较、跳转、内存访问、CPSR/SPSR

文章目录 指令格式&#xff08;重点&#xff09;1. 立即数2. 寄存器位移 一、数据传送指令1. MOV指令2. MVN指令3. LDR指令 二、数据计算指令1. ADD指令1. SUB指令1. MUL指令 三、位运算指令1. AND指令2. ORR指令3. EOR指令4. BIC指令 四、比较指令五、跳转指令1. B/BL指令2. l…

Nacos 的介绍和使用

1. Nacos 的介绍和安装 与 Eureka 一样&#xff0c;Nacos 也提供服务注册和服务发现的功能&#xff0c;Nacos 还支持更多元数据的管理&#xff0c; 同时具备配置管理功能&#xff0c;功能更丰富。 1.1. windows 下的安装和启动方式 下载地址&#xff1a;Release 2.2.3 (May …

【零基础到精通】小白如何自学网络安全

小白人群想学网安但是不知道从哪入手&#xff1f;一篇文章告诉你如何在4个月内吃透网安课程&#xff0c;掌握网安技术 一、基础阶段 1.了解网安相关基础知识 了解中华人民共和国网络安全法、熟知网络安全的相关概念&#xff1a;包括信息安全、风险管理、网络攻防原理、认证与…

架构规划之任务边界划分过程中承接分配

架构师在边界划分的过程中需要做什么事情呢&#xff1f;接下来&#xff0c;我们会讨论一些关于任务分配的 基础假设&#xff0c;以及由这些基础假设而带来的决策路径。 所谓任务边界划分&#xff0c;就是判定某个任务在多个承接方中&#xff0c;应该归属到哪个承接方的过程。…

如可安装部署haproxy+keeyalived高可用集群

第一步&#xff0c;环境准备 服务 IP 描述 Keepalived vip Haproxy 负载均衡 主服务器 Rip&#xff1a;192..168.244.101 Vip&#xff1a;192.168.244.100 Keepalive主节点 Keepalive作为高可用 Haproxy作为4 或7层负载均衡 Keepalived vip Haproxy 负载均衡 备用服务…

MySQL常用数据类型和表的操作

文章目录 (一)常用数据类型1.数值类2.字符串类型3.二进制类型4.日期类型 (二)表的操作1查看指定库中所有表2.创建表3.查看表结构和查看表的创建语句4.修改表5.删除表 (三)总代码 (一)常用数据类型 1.数值类 BIT([M]) 大小:bit M表示每个数的位数&#xff0c;取值范围为1~64,若…

DeepSeekMoE:迈向混合专家语言模型的终极专业化

一、结论写在前面 论文提出了MoE语言模型的DeepSeekMoE架构&#xff0c;目的是实现终极的专家专业化(expert specialization)。通过细粒度的专家分割和共享专家隔离&#xff0c;DeepSeekMoE相比主流的MoE架构实现了显著更高的专家专业化和性能。从较小的2B参数规模开始&#x…

寻迹传感器模块使用说明

产品用途&#xff1a; 1、电度表脉冲数据采样 2、传真机碎纸机纸张检测 3、障碍检测 4、黑白线检测 产品介绍: 1、采用 TCRT5000 红外反射传感器 2、检测反射距离&#xff1a;1mm~25mm 适用 3、比较器输出&#xff0c;信号干净&#xff0c;波形好&#xff0c;驱…