Leetcode 第 419 场周赛题解
Leetcode 第 419 场周赛题解
- Leetcode 第 419 场周赛题解
- 题目1:3318. 计算子数组的 x-sum I
- 思路
- 代码
- 复杂度分析
- 题目2:3319. 第 K 大的完美二叉子树的大小
- 思路
- 代码
- 复杂度分析
- 题目3:
- 思路
- 代码
- 复杂度分析
- 题目4:3321. 计算子数组的 x-sum II
- 思路
- 代码
- 复杂度分析
Leetcode 第 419 场周赛题解
题目1:3318. 计算子数组的 x-sum I
思路
枚举每一个长度为 k 的子数组:
- 用一个哈希表 cnt 统计数组中所有元素的出现次数。
- 排序得到次数最多的前 x 个元素(如果两个元素的出现次数相同,则数值较大的元素被认为出现次数更多)。
- 计算结果数组的和,保存在答案里。
注意,如果数组中的不同元素少于 x 个,则其 x-sum 是数组的元素总和。
最后返回答案数组。
代码
/** @lc app=leetcode.cn id=3318 lang=cpp** [3318] 计算子数组的 x-sum I*/// @lc code=start
class Solution
{
public:vector<int> findXSum(vector<int> &nums, int k, int x){int n = nums.size();vector<int> ans(n - k + 1);auto cal_x_sum = [&](int start) -> int{unordered_map<int, int> cnt;for (int i = start; i < start + k; i++)cnt[nums[i]]++;if (cnt.size() < x)return accumulate(nums.begin() + start, nums.begin() + start + k, 0);vector<pair<int, int>> vp;for (auto &[x, c] : cnt)vp.push_back(make_pair(x, c));sort(vp.begin(), vp.end(),[&](const pair<int, int> &p1, const pair<int, int> &p2){if (p1.second != p2.second)return p1.second > p2.second;elsereturn p1.first > p2.first;});int sum = 0;for (int i = 0; i < x; i++)sum += vp[i].first * vp[i].second;return sum;};for (int i = 0; i < ans.size(); i++)ans[i] = cal_x_sum(i);return ans;}
};
// @lc code=end
复杂度分析
时间复杂度:O((n-k+1) * (k + klogk + x)),其中 n 是数组 nums 的长度。
空间复杂度:O((n-k+1) * k),其中 n 是数组 nums 的长度。
题目2:3319. 第 K 大的完美二叉子树的大小
思路
定义二叉树的高度等于所有结点所在的不同层的数量,空二叉树的高度为 0,只有根结点的二叉树的高度为 1。根据完美二叉树的定义,高度为 h 的完美二叉树的大小是 2h−1,因此可以首先寻找二叉树中的所有完美二叉子树的高度,然后根据第 k 大的完美二叉子树的高度计算其大小。
由于一个二叉树的高度取决于其子树的高度,因此可以使用 DFS 计算每个子树的高度,同时判断每个子树是否为完美二叉子树,使用列表记录所有完美二叉子树的高度。为了实现判断完美二叉子树,规定不是完美二叉子树的子树的高度为 −1。
DFS 结束之后,执行如下操作。
-
如果记录所有完美二叉子树的高度的列表中的元素个数小于 k,则不存在第 k 大的完美二叉子树,返回 −1。
-
如果记录所有完美二叉子树的高度的列表中的元素个数大于等于 k,则将记录所有完美二叉子树的高度的列表按降序排序,排序后返回第 k 大的元素,假设值为 h,则大小是 2h−1。
代码
/** @lc app=leetcode.cn id=3319 lang=cpp** [3319] 第 K 大的完美二叉子树的大小*/// @lc code=start
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution
{
public:int kthLargestPerfectSubtree(TreeNode *root, int k){// 完美二叉子树的高度vector<int> heights;function<int(TreeNode *)> dfs = [&](TreeNode *root){if (root == nullptr)return 0;int leftHeight = dfs(root->left);int rightHeight = dfs(root->right);if (leftHeight < 0 || rightHeight < 0 || leftHeight != rightHeight)return -1;int height = leftHeight + 1;heights.push_back(height);return height;};dfs(root);if (heights.size() < k)return -1;sort(heights.begin(), heights.end(), greater<int>());// 设完美二叉树的高度为 h,其大小为 2^h-1return (1 << heights[k - 1]) - 1;}
};
// @lc code=end
复杂度分析
时间复杂度:O(n),其中 n 是二叉树的结点数。每个结点都被访问一次。
空间复杂度:O(n),其中 n 是二叉树的结点数。空间复杂度主要是递归调用的栈空间,取决于二叉树的高度,最差情况下二叉树的高度是 O(n)。
题目3:
思路
定义状态为 dfs(i,j,ban),表示从 i 到 0,在我们与对手的得分之差为 j 且第 i 回合我们无法召唤的生物为 ban 的前提下,战胜对手的不同出招序列的数量。
递归边界:
- 如果 −j>i,即使后面全胜,也无法战胜对手,返回 0。
- 如果 j>i+1,即使后面全败,也一定能战胜对手。由于剩余 i+1 个回合,每个回合在两个可以召唤的生物中随意选择,所以方案数为 2i+1。
代码
#
# @lc app=leetcode.cn id=3320 lang=python3
#
# [3320] 统计能获胜的出招序列数
## @lc code=start
class Solution:def countWinningSequences(self, s: str) -> int:MOD = 1_000_000_007def getScore(a: str, b: str) -> int:if a == "F" and b == "W":return 1if b == "F" and a == "W":return -1if a == "W" and b == "E":return 1if b == "W" and a == "E":return -1if a == "E" and b == "F":return 1if b == "E" and a == "F":return -1return 0@cachedef dfs(i: int, j: int, ban: int) -> int:if -j > i: # 必败return 0if j > i + 1: # 必胜return pow(2, i + 1, MOD)res = 0for cur in "FWE":if cur == ban:continuescore = getScore(s[i], cur)res += dfs(i - 1, j + score, cur)return res % MODreturn dfs(len(s) - 1, 0, -1)# @lc code=end
复杂度分析
时间复杂度:O(n2K2),其中 n 为字符串 s 的长度,K=3。
空间复杂度:O(n2K),其中 n 为字符串 s 的长度,K=3。
题目4:3321. 计算子数组的 x-sum II
思路
题解:https://leetcode.cn/problems/find-x-sum-of-all-k-long-subarrays-ii/solutions/2948867/liang-ge-you-xu-ji-he-wei-hu-qian-x-da-p-2rcz/
代码
/** @lc app=leetcode.cn id=3321 lang=cpp** [3321] 计算子数组的 x-sum II*/// @lc code=start
class Solution
{
private:using pii = pair<int, int>; // 出现次数,元素值public:vector<long long> findXSum(const vector<int> &nums, int k, int x){int n = nums.size();set<pii> L, R;long long sum_l = 0; // L 的元素和unordered_map<int, int> cnt;auto add = [&](int x){pii p = {cnt[x], x};if (p.first == 0){return;}if (!L.empty() && p > *L.begin()){ // p 比 L 中最小的还大sum_l += (long long)p.first * p.second;L.insert(p);}elseR.insert(p);};auto del = [&](int x){pii p = {cnt[x], x};if (p.first == 0){return;}auto it = L.find(p);if (it != L.end()){sum_l -= (long long)p.first * p.second;L.erase(it);}elseR.erase(p);};auto l2r = [&](){pii p = *L.begin();sum_l -= (long long)p.first * p.second;L.erase(p);R.insert(p);};auto r2l = [&](){pii p = *R.rbegin();sum_l += (long long)p.first * p.second;R.erase(p);L.insert(p);};vector<long long> ans(n - k + 1);for (int r = 0; r < n; r++){// 添加 inint in = nums[r];del(in);cnt[in]++;add(in);int l = r + 1 - k;if (l < 0)continue;// 维护大小while (!R.empty() && L.size() < x)r2l();while (L.size() > x)l2r();ans[l] = sum_l;// 移除 outint out = nums[l];del(out);cnt[out]--;add(out);}return ans;}
};
// @lc code=end
复杂度分析
时间复杂度:O(nlogk),其中 n 是数组 nums 的长度。
空间复杂度:O(n),其中 n 是数组 nums 的长度。
相关文章:
Leetcode 第 419 场周赛题解
Leetcode 第 419 场周赛题解 Leetcode 第 419 场周赛题解题目1:3318. 计算子数组的 x-sum I思路代码复杂度分析 题目2:3319. 第 K 大的完美二叉子树的大小思路代码复杂度分析 题目3:思路代码复杂度分析 题目4:3321. 计算子数组的 …...

那些年 我们说走就走
那些年 我们说走就走 —— 2022-03-20 二月十八 春分 我总是钟情于原生景色,犹如那句 “落霞与孤鹜齐飞,秋水共长天一色。” 所绘。 我热爱骑行,向往自然,对有着 “中国人的景观大道” 之称的 318 国道川藏线憧憬已久。 17 年暑…...

MySQL初识
在了解什么是MySQL前,我们先了解一下什么是数据库?? 1. 数据库简介 1.1 什么是数据库 数据库是20世纪60年代末发展起来的⼀项重要技术,已经成为计算机科学与技术的⼀个重要分⽀。数据库技术主要是⽤来解决数据处理的⾮数值计算问…...

基于Java微信小程序的的儿童阅读系统的详细设计和实现(源码+lw+部署文档+讲解等)
详细视频演示 请联系我获取更详细的演示视频 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念,提供了一套默认的配置,让开发者可以更专注于业务逻辑而不…...

利用 OBS 推送 WEBRTC 流到 smart rtmpd
webrtc whip 推流 & whep 拉流简介 RFC 定义 通用的 webrtc 对于 SDP 协议的交换已经有对应的 RFC 草案出炉了。这就是 WHIP( push stream ) & WHEP ( pull stream ) . WHIP RFC Link: https://www.ietf.org/archive/id/draft-ietf-wish-whip-01.html WHEP RFC Link:…...
【python】极简教程3-函数
函数是将代码组织到可重用块中的一种方法。 函数调用 Python提供了许多内置函数,例如print: print(Hello, World!)函数调用通常包含函数名,后跟圆括号,括号内是参数列表。参数是传递给函数的数据,函数会基于这些数据执行操作。 数学函数 使用math函数前需要先导入mat…...

Python案例小练习——小计算器
文章目录 前言一、代码展示二、运行展示 前言 这是用python实现一个简单的计器。 一、代码展示 def calculate(num1, op, num2):if op "":return float(num1) float(num2)elif op "-":return float(num1) - float(num2)elif op "*":return…...

仓储数字化蓝图
1、仓储能力建设 2、仓储数字化建设...

【数字图像处理】第5章 图像空域增强方法
上理考研周导师的哔哩哔哩频道 我在频道里讲课哦 目录 5.1 图像噪声 相关概念 ①图像噪声的产生 ② 图像噪声分类 ③ 图像噪声特点 5.2 图像增强方法分类 ①图像增强概念 ②图像增强目的 ③图像增强技术方法: 5.3 基于灰度变换的图像增强 1. 概述: 2. 灰度变换…...
idea 发布jar包
当你有一个能正常编译的项目,以springboot为例,有两步步骤 打包配置 打包 一、打包配置 1.点击右上角快捷按钮/文件-->项目结构,打开项目结构设置 2.项目结构-->Artifacts,如图所示选择 3.在Create JAR from Modules配置…...

c语言字符串函数strstr,strtok,strerror
1,strtok函数的使用和模拟实现 char * strtok(char * str,const char * sep) 会有static修饰变量,有记忆功能,会保存字符串的位置,下次找再继续找。 1)sep参数指向一个字符串,它包含了0个或者多个由sep字符中一个或…...
【Java】—JavaBean转换方法详解
JavaBean间的转换 ⭐⭐⭐⭐⭐⭐ Github主页👉https://github.com/A-BigTree 笔记链接👉https://github.com/A-BigTree/Code_Learning ⭐⭐⭐⭐⭐⭐ 如果可以,麻烦各位看官顺手点个star~😊 文章目录 JavaBean间的转换1 Apache Co…...
[Vue3核心语法] setup语法糖
一、setup 概述 setup是Vue3中一个新的配置项,值是一个函数,它是 Composition API “表演的舞台”,组件中所用到的:数据、方法、计算属性、监视......等等,均配置在setup中。 特点: setup函数返回的对象中…...

RabbitMQ 入门(三)SpringAMQP五种消息类型(Basic Queue)
一、Spring AMQP 简介 SpringAMQP是基于RabbitMQ封装的一套模板,并且还利用SpringBoot对其实现了自动装配,使用起来非常方便。 SpringAmqp的官方地址:https://spring.io/projects/spring-amqp SpringAMQP提供了三个功能: - 自动…...

2024双十一买什么好?双十一高性价比数码好物推荐!
双十一购物狂欢节即将来临,这是一年中家电和数码产品优惠力度较大的时候。然而,随着产品种类越来越丰富,选择一款合适的商品也变得越发困难。今天,我为大家推荐一些双十一期间值得入手的高品质好物,让我们一同来了解…...

MySQL 查找连续相同名称的记录组,并保留每组内时间最大的一条记录
要求:查找连续相同名称的记录组,并保留每组内时间最大的一条记录,同时计算每组记录的 num 总和。 今天有人问了我一个问题,大致就是下面这样的数据结构(原谅我实在不知道怎么描述这个问题) 然后需要得到下面…...

three.js 使用geojson ,实现中国地图区域,边缘流动效果
three.js 使用geojson ,实现中国地图区域,边缘流动效果 在线链接:https://threehub.cn/#/codeMirror?navigationThreeJS&classifyexpand&idgeoBorder 国内站点预览:http://threehub.cn github地址: https://github.co…...

数据中台业务架构图
数据中台的业务架构是企业实现数据驱动决策和业务创新的关键支撑。它主要由数据源层、数据存储与处理层、数据服务层以及数据应用层组成。 数据源层涵盖了企业内部各个业务系统的数据,如 ERP、CRM 等,以及外部数据来源,如社交媒体、行业数据…...

Docker学习笔记(2)- Docker的安装
1. Docker的基本组成 镜像(image):Docker镜像就像是一个模板,可以通过这个模板来创建容器服务。通过一个镜像可以创建多个容器。最终服务运行或者项目运行就是在容器中。容器(container):Docker…...

PostgreSql的备份和升级
目录 版本概述: 跨大版本数据迁移 QProcess 调用相关进程进行备份和恢复 版本概述: 该数据库版本主要分为主要版本和次要版本,大版本基本每年发布一次,小版本则每几个月即发布,更新较快。在10.0之前所使用的数据库版…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...

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实现分布式…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...

IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...