当前位置: 首页 > news >正文

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&#xff1a;3318. 计算子数组的 x-sum I思路代码复杂度分析 题目2&#xff1a;3319. 第 K 大的完美二叉子树的大小思路代码复杂度分析 题目3&#xff1a;思路代码复杂度分析 题目4&#xff1a;3321. 计算子数组的 …...

那些年 我们说走就走

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

MySQL初识

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

基于Java微信小程序的的儿童阅读系统的详细设计和实现(源码+lw+部署文档+讲解等)

详细视频演示 请联系我获取更详细的演示视频 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不…...

利用 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包

当你有一个能正常编译的项目&#xff0c;以springboot为例&#xff0c;有两步步骤 打包配置 打包 一、打包配置 1.点击右上角快捷按钮/文件-->项目结构&#xff0c;打开项目结构设置 2.项目结构-->Artifacts&#xff0c;如图所示选择 3.在Create JAR from Modules配置…...

c语言字符串函数strstr,strtok,strerror

1&#xff0c;strtok函数的使用和模拟实现 char * strtok(char * str,const char * sep) 会有static修饰变量&#xff0c;有记忆功能&#xff0c;会保存字符串的位置&#xff0c;下次找再继续找。 1)sep参数指向一个字符串&#xff0c;它包含了0个或者多个由sep字符中一个或…...

【Java】—JavaBean转换方法详解

JavaBean间的转换 ⭐⭐⭐⭐⭐⭐ Github主页&#x1f449;https://github.com/A-BigTree 笔记链接&#x1f449;https://github.com/A-BigTree/Code_Learning ⭐⭐⭐⭐⭐⭐ 如果可以&#xff0c;麻烦各位看官顺手点个star~&#x1f60a; 文章目录 JavaBean间的转换1 Apache Co…...

[Vue3核心语法] setup语法糖

一、setup 概述 setup是Vue3中一个新的配置项&#xff0c;值是一个函数&#xff0c;它是 Composition API “表演的舞台”&#xff0c;组件中所用到的&#xff1a;数据、方法、计算属性、监视......等等&#xff0c;均配置在setup中。 特点&#xff1a; setup函数返回的对象中…...

RabbitMQ 入门(三)SpringAMQP五种消息类型(Basic Queue)

一、Spring AMQP 简介 SpringAMQP是基于RabbitMQ封装的一套模板&#xff0c;并且还利用SpringBoot对其实现了自动装配&#xff0c;使用起来非常方便。 SpringAmqp的官方地址&#xff1a;https://spring.io/projects/spring-amqp SpringAMQP提供了三个功能&#xff1a; - 自动…...

2024双十一买什么好?双十一高性价比数码好物推荐!

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

MySQL 查找连续相同名称的记录组,并保留每组内时间最大的一条记录

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

three.js 使用geojson ,实现中国地图区域,边缘流动效果

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

数据中台业务架构图

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

Docker学习笔记(2)- Docker的安装

1. Docker的基本组成 镜像&#xff08;image&#xff09;&#xff1a;Docker镜像就像是一个模板&#xff0c;可以通过这个模板来创建容器服务。通过一个镜像可以创建多个容器。最终服务运行或者项目运行就是在容器中。容器&#xff08;container&#xff09;&#xff1a;Docker…...

PostgreSql的备份和升级

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

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面&#xff0c;避免重复抓取&#xff0c;以节省资源和时间。 在分布式环境下&#xff0c;增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路&#xff1a;将增量判…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制

使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下&#xff0c;限制某个 IP 的访问频率是非常重要的&#xff0c;可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案&#xff0c;使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...

Razor编程中@Html的方法使用大全

文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...