Leetcode - 周赛419
目录
一,3318. 计算子数组的 x-sum I
二,3319. 第 K 大的完美二叉子树的大小
三,3320. 统计能获胜的出招序列数
四,3321. 计算子数组的 x-sum II
一,3318. 计算子数组的 x-sum I

本题数据范围较小,可以使用滑动窗口计算子数组nums[i,i+k-1]中每个数字出现的次数,然后使用堆计算出现次数最多的前x个元素,计算出当前的x - sum,代码如下:
class Solution {public int[] findXSum(int[] nums, int k, int x) {int n = nums.length;int[] ans = new int[n-k+1];int[] cnt = new int[51];for(int l=0,r=0; r<n; r++){cnt[nums[r]]++;while(r-l+1 > k){cnt[nums[l]]--;l++;}if(r-l+1 == k){PriorityQueue<int[]> que = new PriorityQueue<>((a,b)->a[1]==b[1]?a[0]-b[0]:a[1]-b[1]);for(int i=0; i<51; i++){if(cnt[i] > 0)que.offer(new int[]{i, cnt[i]});if(que.size() > x){que.poll();}}while(!que.isEmpty()){int[] t = que.poll();ans[l] += t[0] * t[1];}} }return ans;}
}
二,3319. 第 K 大的完美二叉子树的大小

本题是一道二叉树问题,主要就是如何判断该树/子树是一颗完全二叉树?如果一个树它的左右两颗子树都是完全二叉树,那么它一定是完全二叉树吗?不一定拿示例一来说,对于节点3/6来说,它们的子树都是完全二叉树,但是以节点3/6为根节点的树不是完全二叉树,因为它们左右子树的节点数量不同(也可以说是它们的高度不同,因为完全二叉树的形状是固定的),所以在判断它是否是完全二叉树时,有两个条件:1、它的左右子树是完全二叉树;2、它的左右子树的节点数量相同/高度相同。
代码如下:
class Solution {List<Integer> ans = new ArrayList<>();public int kthLargestPerfectSubtree(TreeNode root, int k) {dfs(root);Collections.sort(ans);int n = ans.size();return n >= k?ans.get(n-k):-1;}//左右子树节点数相同的写法int dfs(TreeNode root){if(root == null) return 0;int left = dfs(root.left) + 1;int right = dfs(root.right) + 1;if(left > 0 && left == right){ans.add(left*2-1);}else{return -1;}return left + right - 1;}
}class Solution {List<Integer> ans = new ArrayList<>();public int kthLargestPerfectSubtree(TreeNode root, int k) {dfs(root);Collections.sort(ans);int n = ans.size();if(k > n) return -1;return (1 << ans.get(n-k)) - 1;}//左右子树高度相同的写法int dfs(TreeNode root){if(root == null) return 0;int left = dfs(root.left);int right = dfs(root.right);if(left < 0 || right < 0 || left != right) return -1;ans.add(left + 1);return left + 1;}
}
三,3320. 统计能获胜的出招序列数

本题就是一道dfs记忆化的题,将 FWE 分别使用 012 表示(方便记忆化),简单来说就是枚举Bob每一种出招顺序,然后判断得分能否大于Alice,dfs枚举需要知道当前是第几回合(i),Bob前一次召唤的生物(k),以及两者的得分之差(j)。dfs(i,j,k):前 i 个回合两者等分之差为 j,且前一回合Bob出招为 k 时的战胜对手的数量。
代码如下:
class Solution {//f w e : 0 1 2//f > e : 0 > 2//w > f : 1 > 0//e > w : 2 > 1public int countWinningSequences(String s) {int n = s.length();memo = new int[n][2*n+1][4];for(int i=0; i<n; i++){for(int j=0; j<2*n+1; j++)Arrays.fill(memo[i][j], -1);}return dfs(0, 0, 3, s.toCharArray());}int MOD = 1_000_000_007;int[][][] memo;int dfs(int i, int j, int k, char[] s){int n = s.length;if(-j > n - i - 1) return 0;if(i == n) return 1;if(memo[i][j+n][k] != -1) return memo[i][j+n][k];//防止越界,将所有j+nint res = 0;for(int x=0; x<3; x++){if(x == k) continue;int y = s[i]=='F'?0:s[i]=='W'?1:2;int cnt = x - y;if(Math.abs(cnt)==2) cnt = -cnt/2;res = (res + dfs(i+1, j+cnt, x, s))%MOD;}return memo[i][j+n][k] = res;}
}
四,3321. 计算子数组的 x-sum II

本题就是使用两个有序集合分别维护nums[i,i+k-1]的中的出现次数最多的前 x 个元素({出现次数,数字})和剩下的其他元素,然后使用滑动窗口不断模拟元素进出时,两个有序集合如何操作,同时维护前一个有序集合的元素总和。
代码如下:
class Solution {TreeSet<int[]> L = new TreeSet<>((a, b) -> a[0] != b[0] ? a[0] - b[0] : a[1] - b[1]);TreeSet<int[]> R = new TreeSet<>(L.comparator());Map<Integer, Integer> cnt = new HashMap<>();long sumL = 0L;int x;public long[] findXSum(int[] nums, int k, int x) {int n = nums.length;long[] ans = new long[n-k+1];//出现次数最大、数最大this.x = x;for(int l=0,r=0; r<n; r++){remove(nums[r]);//将{key, val}排出cnt.merge(nums[r], 1, Integer::sum);add(nums[r]);//将{key+1, val}输入if(r-l+1 > k){remove(nums[l]);//将{key, val}排出cnt.merge(nums[l], -1, Integer::sum);add(nums[l]);//将{key-1, val}输入l++;}if(r-l+1 == k){ans[l] = sumL;} }return ans;}void add(int val){if(L.size() < x){L.add(new int[]{cnt.get(val), val});sumL += 1L * cnt.get(val) * val;return;}R.add(new int[]{cnt.get(val), val});int[] mx = R.getLast();int[] mn = L.getFirst();if(mx[0] > mn[0] || (mx[0]==mn[0] && mx[1] > mn[1])){sumL -= 1L * mn[0] * mn[1];sumL += 1L * mx[0] * mx[1];R.add(mn);L.remove(mn);L.add(mx);R.remove(mx);}}void remove(int val){if(cnt.getOrDefault(val, 0) == 0) return;int[] rem = new int[]{cnt.get(val), val};if(R.contains(rem)){R.remove(rem);return;}sumL -= 1L * rem[0] * rem[1];L.remove(rem);if(R.size() > 0){int[] res = R.getLast();L.add(res);sumL += 1L * res[0] * res[1];R.remove(res);}}
}
相关文章:
Leetcode - 周赛419
目录 一,3318. 计算子数组的 x-sum I 二,3319. 第 K 大的完美二叉子树的大小 三,3320. 统计能获胜的出招序列数 四,3321. 计算子数组的 x-sum II 一,3318. 计算子数组的 x-sum I 本题数据范围较小,可以…...
C# 的两个list怎么判断是否存在交集
要判断两个 List<string>(dateList 和 LocalDate)是否有交集,可以使用 LINQ(Language Integrated Query)来简化这个过程。以下三种方法来判断两个列表之间是否有交集。 方法 1: 使用 LINQ 的 Any 方法 using S…...
【Python】基础语法
1. 变量 1.1. 变量的创建 变量的定义规则: 变量只能由数字,字母,下划线构成,不能包含特殊符号数字不能作为变量开头变量名不能和 Python 的关键字重复Python 的变量是区分大小写的 除了上述的硬性规则外,还建议变量…...
scala 类的继承
继承的定义 idea实例 语法 重写 重写:在子类中重新定义父类的同名方法 idea实例 多态 多态:传入的对象不同,调用的方法的效果就不同! 原理:参数是父类类型 idea实例 构造器...
穷举vs暴搜vs深搜vs回溯vs剪枝(一)
文章目录 全排列子集找出所有子集的异或总和再求和全排列 II电话号码的字母组合 全排列 题目:全排列 思路 通过深度优先搜索的方式,不断枚举每个数在当前位置的可能性,然后回溯到上一个状态,直到枚举完所有可能性得到正确的结果 r…...
枚举的应用
1.枚举的语法特点 枚举是jdk1.5提供的一个特性 枚举是一个特殊的类,这个类的对象的数量是有限的。在定义枚举类的同时就已经确定了类对象及类对象的数量。 枚举使用enum关键字定义 class A{} enum A{} 在枚举类中的第一行,就需要提供枚举类的对象&a…...
读数据工程之道:设计和构建健壮的数据系统14源系统
1. 源系统中的数据生成 1.1. 数据工程师的工作是从源系统获取数据,对其进行处理,使其有助于为下游用例提供服务 1.2. 数据工程师的角色将在很大程度上转向理解数据源和目的地之间的相互作用 1.3. 数据工程的最基本的数据管道任务——将数据从A移动到B…...
基于SpringBoot+Vue的厨艺交流系统的设计与实现(源码+定制开发)厨艺知识与美食交流系统开发、在线厨艺分享与交流平台开发、智能厨艺交流与分享系统开发
博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…...
STMicroelectronics 意法半导体芯片选型表
意法半导体作为全球知名的半导体厂商,其产品广泛应用于各个领域,从消费电子到工业控制,从汽车电子到通信设备,都能看到意法半导体芯片的身影。在电子硬件设计领域,芯片的选型至关重要。亿配芯城(ICgoodFind…...
TCP/IP 寻址
TCP/IP 寻址 概述 TCP/IP(传输控制协议/互联网协议)是一组用于数据网络的通信协议。它们定义了数据如何在网络上从一个设备传输到另一个设备。在TCP/IP网络中,每个设备都有一个唯一的地址,称为IP地址,用于标识网络上…...
深入探索 APKTool:Android 应用的反编译与重打包工具
文章目录 一、反编译 APK1.1 解压 APK1.2 DEX 文件转换1.3 资源解码 二、重新打包 APK2.1 资源重新编译2.2 smali 转换为 DEX2.3 打包 APK2.4 签名 APK 三、技术原理3.1 Smali/Baksmali3.1.1 DEX 文件格式3.1.2 Smali 语法3.1.2.1 指令3.1.2.2 寄存器3.1.2.3 操作码3.1.2.4 注释…...
软件测试与软件缺陷的基础知识
✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…...
【JPCS独立出版,EI检索稳定】第三届能源互联网及电力系统国际学术会议(ICEIPS 2024)
第三届能源互联网及电力系统国际学术会议(ICEIPS 2024) 2024 3rd International Conference on Energy Internet and Power Systems ICEIPS 2024已成功申请JPCS - Journal of Physics: Conference Series (ISSN:1742-6596) ICEIPS 2024独立出版&…...
ssm配置模式
新版 用Java类,全注解demo案例 1. AppConfig.java (Spring主配置类)package com.example.config;import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.cont…...
[MySQL课后作业]人事管理系统的SQL实践
第一题 1.假设某商业集团中有若干公司,人事数据库中有3个基本表: 职工表:EMP(E#.ENAME,AGE, SEX, ECITY)。 其属性分别表示职工工号、姓名、年龄、性别和居住城市。 工作表:WORKS(E#,C#,SALARY)。其属性分别表示职工工号、所在公司的编号和工资。 公司表:COMP(C#,CA…...
【MySQL】增删改查-进阶(二)
目录 🌴新增 🎄查询 🚩聚合查询 🏀聚合函数 🏀group by子句 🏀HAVING 🚩联合查询 🏀内连接 🏀外连接 🏀自连接 🏀子查询 🏀…...
cefsharp79.1.360(Chromium 79.0.3945.130)支持H264视频播放-PDF预览 老版本回顾系列体验
一、关于此版本 版本:Cef 79.1.36/CefSharp 79.1.360/Chromium 79.0.3945.130/支持H264/支持PDF预览 支持PDF预览和H264推荐版本 63/79/84/88/100/111/125 运行环境需要 visual c++ 2015不支持xp/vista/2003/2008默认不支持h264(版权问题)支持打印预览 print preview已知问题…...
【Linux】main函数的参数列表从何而来?
Linux系统进程通过exec系列函数启动新程序时,argc整型 、 argv数组 和 环境变量表 environ 会作为 exec 系列函数的参数,显式传递给新程序的 main 函数。 main函数的参数列表 在C语言中,main函数的标准参数列表通常如下所示: in…...
缓冲区类QBuffer
1、QBuffer继承自QIODevice 2、是一种随机设备 3、和QFile类似, 4、有了 QBuffer,你可以把 QByteArray 当成文件一样来操作 其主要作用就是像QFile操作文件一样来操作一块QByteArray(内存区域),比如读和写 常用方…...
从一个事故中理解 Redis(几乎)所有知识点
作者:看破 一、简单回顾 事故回溯总结一句话: (1)因为大 KEY 调用量,随着白天自然流量趋势增长而增长,最终在业务高峰最高点期占满带宽使用 100%。   (2ÿ…...
C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...
无人机侦测与反制技术的进展与应用
国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机(无人驾驶飞行器,UAV)技术的快速发展,其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统,无人机的“黑飞”&…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...
SQL Server 触发器调用存储过程实现发送 HTTP 请求
文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...
Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践
在 Kubernetes 集群中,如何在保障应用高可用的同时有效地管理资源,一直是运维人员和开发者关注的重点。随着微服务架构的普及,集群内各个服务的负载波动日趋明显,传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...
FOPLP vs CoWoS
以下是 FOPLP(Fan-out panel-level packaging 扇出型面板级封装)与 CoWoS(Chip on Wafer on Substrate)两种先进封装技术的详细对比分析,涵盖技术原理、性能、成本、应用场景及市场趋势等维度: 一、技术原…...
