LeetCode 第136场双周赛个人题解

devtools/2024/9/22 13:12:22/

Q1. 求出胜利玩家的数目

原题链接

Q1. 求出胜利玩家的数目

思路分析

直接模拟

时间复杂度:O(N)

AC代码

class Solution {
public:int winningPlayerCount(int n, vector<vector<int>>& pick) {unordered_map<int, unordered_map<int, int>> cnt;for (auto& v : pick) {cnt[v[0]][v[1]] ++;}int res = 0;for (auto& [x, u] : cnt) {for (auto [c, d] : u) {if (x == 0 || d > x) {++ res;break;}}}return res;}
};

Q2. 最少翻转次数使二进制矩阵回文 I

原题链接

Q2. 最少翻转次数使二进制矩阵回文 I

思路分析

直接贪心就行,计算原矩阵和转置矩阵的每一行的不同的两两对称位置的数目,取小的那个

时间复杂度:O(MN)

AC代码

class Solution:def minFlips(self, grid: List[List[int]]) -> int:res1 = 0for row in grid:n = len(row)l, r = 0, n - 1while l < r:res1 += 1 if row[l] != row[r] else 0l += 1r -= 1grid = list(zip(*grid))res2 = 0for row in grid:n = len(row)l, r = 0, n - 1while l < r:res2 += 1 if row[l] != row[r] else 0l += 1r -= 1return min(res1, res2)

Q3. 最少翻转次数使二进制矩阵回文 II

原题链接

Q3. 最少翻转次数使二进制矩阵回文 II

思路分析

思维+分组背包

左上左下右上右下关于原点对称,所以矩阵只要满足回文,这四部分中1的数目一定是4的倍数

我们只需考虑行列为奇数的时候横对称轴和竖对称轴的情况

同样对两个对称轴的两两对称位置遍历,他们最终的结果要么是两个1要么是两个0,两个0的代价就是2 - 他们的和,两个1的代价也是2 - 他们的和

我们发现这就是一个分组背包问题,最多(n + m) / 2个组,每组内2个物品,背包容量为4

我们处理完四个对称部分的调整次数后,对横对称轴和竖对称轴求分组背包即可

时间复杂度:O(NM + N + M)

AC代码

class Solution:def minFlips(self, grid: List[List[int]]) -> int:res = c = 0m, n = len(grid), len(grid[0])buf = []res = 0for i in range(m // 2):for j in range(n // 2):s = grid[i][j] + grid[m - 1 - i][j] + grid[i][n - 1 - j] + grid[m - 1 - i][n - 1- j]res += min(4 - s, s)if m % 2:row = grid[m // 2]l, r = 0, n - 1while l < r:s = row[l] + row[r]buf.append([[0, s], [2, abs(2 - s)]])l += 1r -= 1if n % 2:l, r = 0, m - 1while l < r:s = grid[l][n // 2] + grid[r][n // 2]buf.append([[0, s],  [2, abs(2 - s)]])l += 1r -= 1if m % 2 and n % 2:t = grid[m // 2][n // 2]buf.append([[t, 0], [0, t]])if not buf:return resf = [inf, inf, inf, inf]for r in buf:nf = f.copy()for j in range(4):mi = inffor x, v in r:t = ((j - x) % 4 + 4) % 4if nf[x % 4] == inf:f[x % 4] = min(f[x % 4], v)mi = min(nf[t] + v, mi)if nf[j] == inf:f[j] = min(f[j], mi)else:f[j] = mireturn res + f[0]

Q4. 标记所有节点需要的时间

原题链接

Q4. 标记所有节点需要的时间

思路分析

换根dp

很明显的换根dp,为什么呢?

0时刻从根节点开始标记所需时间取决于根节点的孩子和根节点的奇偶性

而且题目要我们求出每个结点作为根时的情况,自然想到换根dp

先一次dfs0预处理d[],d[u] 代表0时刻开始标记u,u所在子树全部搞定的时间

然后dfs1 进行换根

求u 的儿子结点中 d[v] + (v & 1 ? 1 : 2)的最大值和次大值fi, se

那么我们换根为v时,如果d[v] + (v & 1 ? 1 : 2) == fi, 那么换根后d[u] = se,否则为fi

时间复杂度:O(N)

AC代码

class Solution:def timeTaken(self, edges: List[List[int]]) -> List[int]:n = len(edges) + 1adj = [[] for _ in range(n)]for x, y in edges:adj[x].append(y)adj[y].append(x)d = [0] * ndef dfs0(u: int, p: int) -> None:for v in adj[u]:if v == p:continuedfs0(v, u)d[u] = max(d[u], d[v] + (1 if v % 2 else 2))dfs0(0, -1)ans = [0] * ndef dfs1(u: int, p: int) -> None:fi, se = 0, 0for v in adj[u]:if d[v] + (1 if v % 2 else 2) > fi:se = fifi = d[v] + (1 if v % 2 else 2)elif d[v] + (1 if v % 2 else 2) > se:se = d[v] + (1 if v % 2 else 2)ans[u] = fifor v in adj[u]:if v == p:continued[u] = se if d[v] + (1 if v % 2 else 2) == fi else fidfs1(v, u)dfs1(0, -1)return ans


http://www.ppmy.cn/devtools/89004.html

相关文章

【Material-UI 组件】Autocomplete 中的 Grouped 功能详解

文章目录 一、组件概述1.1 Grouped 功能介绍1.2 适用场景 二、基础用法2.1 实现 Grouped 功能代码拆解 三、高级配置3.1 自定义组渲染3.2 常见配置 四、最佳实践4.1 数据排序4.2 组标题优化4.3 性能优化4.4 可访问性 五、总结 Grouped 功能使得 Autocomplete 组件能够按特定维度…

go range使用,及在赋值使用时候的陷阱点

for range中临时变量取值是列表元素的副本 代码代码一&#xff1a; studentInfos : [3]StudentInfo{}for _, a : range studentInfos {a.Name "zhangsan"a.Age 18a.Sex "man"}for _, stu : range studentInfos {fmt.Println("student info:"…

白骑士的PyCharm教学高级篇 3.4 服务器部署与配置

系列目录 上一篇&#xff1a;白骑士的PyCharm教学高级篇 3.3 Web开发支持 在开发完成后&#xff0c;将代码部署到服务器上是一个关键步骤。PyCharm不仅提供了强大的本地开发支持&#xff0c;还为远程服务器配置与部署、自动化部署流程提供了便捷的工具和功能。本文将详细介绍如…

HarmonyOS实现商品分类导航页面

目录 一:功能概述 二:代码实现 三:效果图 一:功能概述 分类导航采用左右结构布局,我们这里简单展示一级分类,以及该分类下的商品信息。左侧显示商品的一级分类,右侧显示显示该分类的商品。默认从首页进入该分类页面时,显示第一个分类的商品,切换一级分类时,传入分…

内联函数的概念和用途以及区别

内联函数&#xff08;Inline Function&#xff09;是C&#xff08;以及C99之后的C语言&#xff09;中的一个特性&#xff0c;旨在通过减少函数调用的开销来提高程序的执行效率。在正常情况下&#xff0c;当程序调用一个函数时&#xff0c;会发生一系列的操作&#xff0c;包括保…

《网络安全自学教程》- MySQL匿名用户的原理分析与实战研究

《网络安全自学教程》 低版本的MySQL数据库在安装时会创建一个用户名和密码为空的账户&#xff0c;也就是匿名账户。即使升级到高版本&#xff0c;匿名账户仍然会存在。 MySQL匿名账户 1、检查是否存在匿名账户2、检查用户权限3、创建匿名账户4、使用匿名账户登录5、删除匿名账…

三角形的四心的向量表示 | 难点

前言 若三角形的四心用文字语言表述时&#xff0c;许多学生还可以对付一阵&#xff0c;若但换成向量形式的符号语言&#xff0c;则大多就哑口无言了&#xff0c;所以有必要将三角形四心的向量表示形式好好作以总结储备。 相关延伸 常用结论 1、已知 O O O 为 △ A B C \tr…

【STM32】GPIO和AFIO标准库使用框架

本篇博客重点在于标准库函数的理解与使用&#xff0c;搭建一个框架便于快速开发 目录 GPIO简介 GPIO时钟使能 GPIO初始化 工作模式 选择引脚 输出速度 函数应用 GPIO初始化框架 8个电平读写函数 写端口电平 读端口电平 GPIO框架汇总 AFIO简介 AFIO时钟使能 函数应…