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ÿ…...

MySQL程序介绍<二>
目录 mysqlcheck - 表维护程序 Mysqldump - 数据库备份程序 mysqladmin - MySQL 服务器管理程序 mysqlshow - 显⽰数据库、表和列信息 mysqldumpslow - 总结慢查询⽇志⽂件 编辑 mysqlbinlog - 处理⼆进制⽇志⽂件 mysqlslap - 负载仿真客⼾端 接着上篇继续介绍MySQL…...

Java项目实战II基于Spring Boot的毕业就业信息管理系统设计与实现(源码+数据库+文档)
目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着高校扩…...

LeetCode 1343.大小为K且平均值大于等于阈值的子数组数目
题目: 给你一个整数数组 arr 和两个整数 k 和 threshold 。 请你返回长度为 k 且平均值大于等于 threshold 的子数组数目。 思路:定长滑动窗口 入 更新 出 代码: class Solution {public int numOfSubarrays(int[] arr, int k, int t…...

【电商项目】1分布式基础篇
1 项目简介 1.2 项目架构图 1.2.1 项目微服务架构图 1.2.2 微服务划分图 2 分布式基础概念 3 Linux系统环境搭建 查看网络IP和网关 linux网络环境配置 补充P123(修改linux网络设置&开启root密码访问) 设置主机名和hosts映射 主机名解析过程分析&…...

PHP嵌套函数
PHP嵌套函数(Nested Functions)在标准的PHP语法中并不直接支持,也就是说,你不能在一个函数内部直接定义另一个函数。然而,可以通过闭包(Closures)和匿名函数(Anonymous Functions&am…...

外包干了2个月,技术明显退步
回望过去,我是一名普通的本科生,于2019年通过校招有幸加入了南京某知名软件公司。那时的我,满怀着对未来的憧憬和热情,投入到了功能测试的岗位中。日复一日,年复一年,转眼间,我已经在这个岗位上…...

kaptcha依赖maven无法拉取的问题
老依赖了,就是无法拉取,也不知道为什么,就是用maven一直拉去不成功,还以为是魔法的原因,试了好久发现不是,只好在百度寻求帮助了,好在寻找到了这位大佬的文章Maven - 解决无法安装 Kaptcha 依赖…...

48.旋转图像
秋招未止脚步不止,大厂,我一定要上大厂! 题目链接 . - 力扣(LeetCode) 自己的思路 感觉好难,想不出来. 噫噫噫,我想着想着又想出来了。 //发现规律了,先左右对称, 再…...

每天5分钟玩转C#/.NET之goto跳转语句
前言 在我们日常工作中常用的C#跳转语句有break、continue、return,但是还有一个C#跳转语句很多同学可能都比较的陌生就是goto,今天大姚带大家一起来认识一下goto语句及其它的优缺点。 goto语句介绍 goto 语句由关键字 goto 后跟一个标签名称组成&…...

Java处理大数据小技巧:深入探讨与实践
引言 一、选择合适的数据结构 1. 使用高效的集合 2. 并发安全的数据结构 二、内存管理 1. JVM参数调优 2. 避免内存泄漏 三、并行计算与分布式处理 1. 利用Java并发API 2. 分布式框架 四、数据压缩与序列化 1. 数据压缩 2. 高效序列化 五、外部存储与缓存 1. NoS…...