Leetcode 第 422 场周赛题解

Leetcode 第 422 场周赛题解

  • Leetcode 第 422 场周赛题解
    • 题目1:3340. 检查平衡字符串
      • 思路
      • 代码
      • 复杂度分析
    • 题目2:3341. 到达最后一个房间的最少时间 I
      • 思路
      • 代码
      • 复杂度分析
    • 题目3:3342. 到达最后一个房间的最少时间 II
      • 思路
      • 代码
      • 复杂度分析
    • 题目4:3343. 统计平衡排列的数目
      • 思路
      • 代码
      • 复杂度分析

Leetcode 第 422 场周赛题解

题目1:3340. 检查平衡字符串

思路

模拟。

代码

/** @lc app=leetcode.cn id=3340 lang=cpp** [3340] 检查平衡字符串*/// @lc code=start
class Solution
{
public:bool isBalanced(string num){int oddSum = 0, evenSum = 0;for (int i = 0; i < num.length(); i++)(i % 2 ? oddSum : evenSum) += (num[i] - '0');return oddSum == evenSum;}
};
// @lc code=end

复杂度分析

时间复杂度:O(n),其中 n 是字符串 num 的长度。

空间复杂度:O(1)。

题目2:3341. 到达最后一个房间的最少时间 I

思路

广度优先搜索。

一个节点的最短路径可能来自于上下左右,单纯用BFS会导致重复访问节点,造成死循环问题。为此,使用一个distance[m][n]的数组来记录从(0,0)节点到当前节点(i,j)的最短路径,当重复访问节点时,只有在当前最小值被更新时,才将这个节点加入队列(相当于更新操作,重新从该点出发去找寻到达最终节点的最短路径),否则不加入队列,这样就不会造成死循环问题。

代码

/** @lc app=leetcode.cn id=3341 lang=cpp** [3341] 到达最后一个房间的最少时间 I*/// @lc code=start
class Solution
{
private:const int dx[4] = {0, 1, 0, -1};const int dy[4] = {1, 0, -1, 0};public:int minTimeToReach(vector<vector<int>> &moveTime){int m = moveTime.size(), n = m ? moveTime[0].size() : 0;// distance[i][j]记录从节点(0,0)到当前节点(i,j)的最短路径vector<vector<int>> distance(m, vector<int>(n, INT_MAX / 2));queue<pair<int, int>> q;int ans = INT_MAX;q.push({0, 0});distance[0][0] = 0;while (!q.empty()){auto t = q.front();q.pop();int x = t.first / n, y = t.first % n;if (x == m - 1 && y == n - 1)ans = min(ans, t.second);for (int i = 0; i < 4; i++){int r = x + dx[i], c = y + dy[i];if (r >= 0 && r < m && c >= 0 && c < n){if (moveTime[r][c] >= distance[x][y]){if (distance[r][c] <= moveTime[r][c] + 1)continue;distance[r][c] = moveTime[r][c] + 1;q.push({r * n + c, distance[r][c]});}else{if (distance[r][c] <= distance[x][y] + 1)continue;distance[r][c] = distance[x][y] + 1;q.push({r * n + c, distance[r][c]});}}}}return ans;}
};
// @lc code=end

复杂度分析

时间复杂度:O(m * n),其中 m 和 n 分别表示二维数组 moveTime 的长度和宽度。

空间复杂度:O(m * n),其中 m 和 n 分别表示二维数组 moveTime 的长度和宽度。

题目3:3342. 到达最后一个房间的最少时间 II

思路

题目要计算从左上角到右下角的最短路,这可以用 Dijkstra 算法解决。

设从起点走到 (i,j) 的最短路为 distance[i][j]。

那么从 (i,j) 走到相邻格子 (x,y),到达 (x,y) 的时间为 max(dis[i][j],moveTime[x][y])+time。

对于本题,由于每走一步 time 都会在 1,2 之间变化,联系国际象棋棋盘,(i+j) 的奇偶性就决定了 time,即 time=(i+j)mod2+1。

由于一定可以从起点走到终点,我们可以在循环中判断,只要出堆的点是终点,就立刻返回 dis[m−1][n−1]。

代码

/** @lc app=leetcode.cn id=3342 lang=cpp** [3342] 到达最后一个房间的最少时间 II*/// @lc code=start
class Solution
{
private:const int dx[4] = {0, 1, 0, -1};const int dy[4] = {1, 0, -1, 0};public:int minTimeToReach(vector<vector<int>> &moveTime){int m = moveTime.size(), n = m ? moveTime[0].size() : 0;// distance[i][j]记录从节点(0,0)到当前节点(i,j)的最短路径vector<vector<int>> distance(m, vector<int>(n, INT_MAX));priority_queue<tuple<int, int, int>, vector<tuple<int, int, int>>, greater<>> pq;pq.emplace(0, 0, 0);distance[0][0] = 0;while (1){auto [dis, x, y] = pq.top();pq.pop();if (x == m - 1 && y == n - 1)return dis;if (dis > distance[x][y])continue;for (int i = 0; i < 4; i++){int r = x + dx[i], c = y + dy[i];if (r >= 0 && r < m && c >= 0 && c < n){int new_dis = max(dis, moveTime[r][c]) + (x + y) % 2 + 1;if (new_dis < distance[r][c]){distance[r][c] = new_dis;pq.emplace(new_dis, r, c);}}}}}
};
// @lc code=end

复杂度分析

时间复杂度:O(m * n * log(m * n)),其中 m 和 n 分别表示二维数组 moveTime 的长度和宽度。

空间复杂度:O(m * n),其中 m 和 n 分别表示二维数组 moveTime 的长度和宽度。

题目4:3343. 统计平衡排列的数目

思路

多重集排列数 + 计数 DP。

题解:https://leetcode.cn/problems/count-number-of-balanced-permutations/solutions/2975507/duo-zhong-ji-pai-lie-shu-ji-shu-dppython-42ky/

代码

/** @lc app=leetcode.cn id=3343 lang=cpp** [3343] 统计平衡排列的数目*/// @lc code=start
const int MOD = 1'000'000'007;
const int MX = 41;long long F[MX];     // F[i] = i!
long long INV_F[MX]; // INV_F[i] = i!^-1long long pow(long long x, int n)
{long long res = 1;for (; n; n /= 2){if (n % 2){res = res * x % MOD;}x = x * x % MOD;}return res;
}auto init = []
{F[0] = 1;for (int i = 1; i < MX; i++){F[i] = F[i - 1] * i % MOD;}INV_F[MX - 1] = pow(F[MX - 1], MOD - 2);for (int i = MX - 1; i; i--){INV_F[i - 1] = INV_F[i] * i % MOD;}return 0;
}();class Solution
{
public:int countBalancedPermutations(string num){int cnt[10];int total = 0;for (char c : num){cnt[c - '0']++;total += c - '0';}if (total % 2)return 0;// 原地求前缀和partial_sum(cnt, cnt + 10, cnt);int n = num.size(), n1 = n / 2;vector<vector<vector<int>>> memo(10, vector(n1 + 1, vector<int>(total / 2 + 1, -1))); // -1 表示没有计算过auto dfs = [&](auto &dfs, int i, int left1, int left_s) -> int{if (i < 0){return left_s == 0;}int &res = memo[i][left1][left_s]; // 注意这里是引用if (res != -1){ // 之前计算过return res;}res = 0;int c = cnt[i] - (i ? cnt[i - 1] : 0);int left2 = cnt[i] - left1;for (int k = max(c - left2, 0); k <= min(c, left1) && k * i <= left_s; k++){int r = dfs(dfs, i - 1, left1 - k, left_s - k * i);res = (res + r * INV_F[k] % MOD * INV_F[c - k]) % MOD;}return res;};return F[n1] * F[n - n1] % MOD * dfs(dfs, 9, n1, total / 2) % MOD;}
};
// @lc code=end

复杂度分析

时间复杂度:O(n2S),其中 n 为字符串 num 的长度,S 为字符串 num 的数字和的一半,这不超过 9n/2。注意本题要把状态 i 和枚举 k 结合起来看,这二者一起是 O(n) 的。

空间复杂度:O(DnS),其中 D=10。保存多少状态,就需要多少空间。

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

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

相关文章

Memento 备忘录模式

备忘录模式 意图结构适用性实例Java Web开发中的简单示例Originator 类Memento 类Caretaker 类 文本编辑器示例1. Originator (发起人) - TextEditor2. Memento (备忘录) - TextMemento3. Caretaker (负责人) - History4. 使用示例输出 备忘录模式&#xff08;Memento Pattern&…

导入项目时微信开发者工具如何自动识别项目APPID

一、需求 当我们在公司拉取小程序项目的时候&#xff0c;经常会在微信开发者工具中导入项目&#xff0c;需要我们手动输入自己的appid非常麻烦&#xff0c;我们可以用在导入项目的时候自动识别公司的appid 二、步骤 2.1 使用Hbuilder工具编译项目 编译成功后会有一个unpacka…

小语言模型介绍与LLM的比较

小模型介绍 小语言模型&#xff08;SLM&#xff09;与大语言模型&#xff08;LLM&#xff09;相比&#xff0c;具有不同的特点和应用场景。大语言模型通常拥有大量的参数&#xff08;如 GPT-3 拥有 1750 亿个参数&#xff09;&#xff0c;能够处理复杂的自然语言任务&#xff…

17.快递物流仓库管理系统(基于springboot和vue)

目录 1.系统的受众说明 2.系统详细设计 2.1 需求分析 2.2 系统功能设计 2.3 开发环境分析 ​​​​​​​2.4 E-R图设计 2.5 数据库设计 3. 系统实现 3.1 环境搭建 ​​​​​​​3.2 员工信息管理模块 3.3 销售订单信息管理模块 ​​​​​​​3.4 图表分析模块…

Shortcut Learning in In-Context Learning: A Survey

为我们的综述打一打广告&#xff0c;目前是初级版本&#xff0c;欢迎各位批评指正&#xff01;后续的论文列表、测评基准会在Github更新[/(ㄒoㄒ)/~~最近比较忙容许我拖一拖] 这里是arxiv链接&#xff1a;Linking!!! Abstract&#xff1a;捷径学习是指模型在实际任务中使用简单…

13.useTimeout

在 React 应用中&#xff0c;延迟执行某些操作是一个常见需求。传统的 setTimeout 在函数组件中使用可能会导致一些问题&#xff0c;如闭包陷阱或难以正确清理。useTimeout 钩子提供了一种声明式的方法来实现延迟执行&#xff0c;使得定时器的管理更加简单和可靠。这个自定义钩…

Golang gRPC

为什么要使用 gRPC&#xff1f; 我们的示例是一个简单的路线映射应用程序&#xff0c;它允许客户端获取有关路线上的特征的信息&#xff0c;创建路线摘要&#xff0c;并与服务器和其他客户端交换路线信息&#xff0c;例如交通更新。 使用 gRPC&#xff0c;我们可以在 .proto …

第三十四章 Vue路由进阶之声明式导航(导航高亮)

目录 一、导航高亮 1.1. 基于语法 1.2. 主要代码 二、声明式导航的两个类名 2.1. 声明式导航类名匹配方式 2.2. 声明式导航类名样式自定义 ​2.3. 核心代码 一、导航高亮 1.1. 基于语法 在Vue中通过VueRouter插件&#xff0c;我们可以非常简单的实现实现导航高亮效果…

群控系统服务端开发模式-应用开发-系统配置开发

其实在前面的章节中就已经提到过系统配置开发这块&#xff0c;包括建表及数据层开发都已完毕《群控系统服务端开发模式-应用开发-业务架构逻辑开发BaseAPI继续开发一》&#xff0c;今天在这里只要把系统配置控制层及验证层开发完毕就可以咯。 一、路由配置 因它是固定数据&…

第七部分:1. STM32之ADC实验--单通道实验

主要利用一个模拟量的电位器来实时改变电压值&#xff0c;通过STM32自带的ADC通道来采集这个数据&#xff0c;并打印出来&#xff01; 一句话&#xff0c;学完STM32&#xff0c;我就往南走&#xff0c;我的工资只有5000.~~~~Whappy

Ubuntu20.04两种安装及配置中文界面、输入法、换源、共享文件夹实现,及注意事项

虚拟机安装法 1、新建虚拟机&#xff0c;自定义下一步 任意指定路径 提高处理器数量能加快系统响应 完成以后不要运行&#xff0c;添加镜像文件 导入镜像文件&#xff0c;点击浏览 选择后打开->确认->运行虚拟机 出现这种情况就需要检查虚拟机的配置&#xff0c;操作系统…

记录解决vscode 登录leetcode中遇到的问题

1. 安装完 leetcode 点击sign in to leetcode 点击打开网站登录leetcode&#xff0c;发现网页无法打开。 解决办法&#xff1a;将leetcode.cn.js文件中的leetcode-cn.com路径都改成leetcode.cn 2. 继续点击 sign in to leetcode &#xff0c;选择使用账号登录&#xff0c;始…

docker镜像仓库实战

docker镜像仓库实战 搭建一个nginx服务基础知识(Web服务器)查找nginx镜像拉取镜像启动nginx镜像 搭建一个nginx服务 基础知识(Web服务器) Web 服务器&#xff0c;一般是指“网站服务器”&#xff0c;是指驻留于互联网上某种类型计算机的程序。Web 服务器可以向 Web 浏览器等客…

zabbix安装配置与使用

zabbix Zabbix的工作原理如下: 监控部分: Zabbix Agent安装在各个需要监控的主机上,它以主配置的时间间隔(默认60s)收集主机各项指标数据,如CPU占用率、内存使用情况等。 通讯部分: Agent会把收集的数据通过安全通道(默认10051端口)发送到Zabbix Server。Server会存储这些数…

2024江苏省网络建设与运维省赛Linux(十) mariadb 服务

(十) mariadb 服务 【任务描述】 请安装 mariadb 服务,建立数据表。 (1)配置 linux3 为 mariadb 服务器,创建数据库用户 xiao,在任意机器上对所有数据 库有完全权限。创建数据库 userdb;在库中创建表 userinfo,表结构如下: 数据库信息表 (2)在表中插入 2 条记…

CSS的三个重点

目录 1.盒模型 (Box Model)2.位置 (position)3.布局 (Layout)4.低代码中的这些概念 在学习CSS时&#xff0c;有三个概念需要重点理解&#xff0c;分别是盒模型、定位、布局 1.盒模型 (Box Model) 定义&#xff1a; CSS 盒模型是指每个 HTML 元素在页面上被视为一个矩形盒子。…

STM32中ARR(自动重装寄存器)为什么要减1

在STM32定时器的配置中&#xff0c;ARR&#xff08;自动重装载寄存器&#xff09;需要减1的原因主要与定时器的计数方式和寄存器的设置方式有关。以下是对此问题的详细解释&#xff1a; 一、定时器的计数方式 STM32的定时器通常采用递增计数方式&#xff0c;即计数器&#xf…

关于LLC知识23(频率越大变压器体积越小?)

为什么频率越高&#xff0c;同样的磁芯就可以用的更小&#xff1f; 变压器他负责的功能是 1、隔离 2、能量传递 这里主要是与能量传递有关 我们首先要知道&#xff0c;次级的输出功率一定的情况下&#xff0c;那么在一定的时段内消耗的能量就是一定的&#xff0c;比如1000W…

UE5.4 PCG Layered Biomes插件

B站学习链接 官方文档 一、PCGSpawn Preset&#xff1a;负责管理PCG要用到的植被资产有哪些 二、BiomesSettings&#xff1a;设置要使用的植被资产Layer、Spawn参数 1.高度Layer参数&#xff1a; 2.地形Layer&#xff1a;我这里用地形样条线绘制了一块地形Layer 绘制点和…

数字后端零基础入门系列 | Innovus零基础LAB学习Day8

###LAB15 Detail Routing for Signal Integrity, Timing, Power and Design for Yield 这个章节虽然标题有点长&#xff0c;但不要被它吓到&#xff0c;其实这个章节就是Innovus工具的绕线Routing。只不过这个阶段做Route不是仅仅是把所有的逻辑连接&#xff0c;用实际的金属层…