Leetcode 第 136 场双周赛题解

embedded/2024/12/22 21:48:56/

Leetcode 第 136 场双周赛题解

  • Leetcode 第 136 场双周赛题解
    • 题目1:3238. 求出胜利玩家的数目
      • 思路
      • 代码
      • 复杂度分析
    • 题目2:3239. 最少翻转次数使二进制矩阵回文 I
      • 思路
      • 代码
      • 复杂度分析
    • 题目3:3240. 最少翻转次数使二进制矩阵回文 II
      • 思路
      • 代码
      • 复杂度分析
    • 题目4:3241. 标记所有节点需要的时间
      • 思路
      • 代码
      • 复杂度分析

Leetcode 第 136 场双周赛题解

题目1:3238. 求出胜利玩家的数目

思路

遍历 pick,用一个 n×11 大小的矩阵,统计每个玩家得到的每种颜色的球的个数。

遍历每个玩家,如果该玩家至少有一种颜色的球大于玩家编号,则把答案加一。

代码

/** @lc app=leetcode.cn id=3238 lang=cpp** [3238] 求出胜利玩家的数目*/// @lc code=start
class Solution
{
public:int winningPlayerCount(int n, vector<vector<int>> &pick){vector<vector<int>> cnt(n, vector<int>(11, 0));for (auto &p : pick)cnt[p[0]][p[1]]++;int ans = 0;for (int i = 0; i < n; i++){bool judge = false;for (int j = 0; j < cnt[i].size(); j++)if (cnt[i][j] > i)judge = true;if (judge)ans++;}return ans;}
};
// @lc code=end

复杂度分析

时间复杂度:O(nU+m),其中 m 是数组 pick 的长度,U 是 yi 的最大值。

空间复杂度:O(nU),其中 U 是 yi 的最大值。

题目2:3239. 最少翻转次数使二进制矩阵回文 I

思路

先计算所有行变成回文最少需要翻转多少次。

也就是对于每一行 row,计算这一行变成回文最少需要翻转多少次。

也就是累加 row[j]!=row[n−1−j] 的个数,其中 0≤j≤⌊n/2⌋。

对于列,统计方式同理。

两种情况取最小值,即为答案。

代码

/** @lc app=leetcode.cn id=3239 lang=cpp** [3239] 最少翻转次数使二进制矩阵回文 I*/// @lc code=start
class Solution
{
public:int minFlips(vector<vector<int>> &grid){int m = grid.size(), n = m ? grid[0].size() : 0;int diff_row = 0;for (int i = 0; i < m; i++)for (int j = 0; j < n / 2; j++)diff_row += grid[i][j] != grid[i][n - 1 - j];int diff_col = 0;for (int j = 0; j < n; j++)for (int i = 0; i < m / 2; i++)diff_col += grid[i][j] != grid[m - 1 - i][j];return min(diff_row, diff_col);}
};
// @lc code=end

复杂度分析

时间复杂度:O(m * n),其中 m 和 n 分别为数组 grid 的行数和列数。

空间复杂度:O(1)。

题目3:3240. 最少翻转次数使二进制矩阵回文 II

思路

分类讨论。

在这里插入图片描述

特殊情况:

讨论正中间一排(如果 m 是奇数)和正中间一列(如果 n 是奇数)中的格子要如何翻转。

在这里插入图片描述

综上所述:

  • 如果 diff>0,额外把 diff 加入答案。
  • 如果 diff=0,额外把 cnt1 mod4 加入答案。

代码

/** @lc app=leetcode.cn id=3240 lang=cpp** [3240] 最少翻转次数使二进制矩阵回文 II*/// @lc code=start
class Solution
{
public:int minFlips(vector<vector<int>> &grid){int m = grid.size(), n = m ? grid[0].size() : 0;int ans = 0;for (int i = 0; i < m / 2; i++)for (int j = 0; j < n / 2; j++){int cnt1 = grid[i][j] + grid[i][n - 1 - j] + grid[m - 1 - i][j] + grid[m - 1 - i][n - 1 - j];ans += min(cnt1, 4 - cnt1); // 全为 1 或全为 0}if (m % 2 && n % 2 && grid[m / 2][n / 2] == 1){// 正中间的数必须是 0ans++;}int diff = 0, cnt1 = 0;if (m % 2){// 统计正中间这一排for (int j = 0; j < n / 2; j++){if (grid[m / 2][j] != grid[m / 2][n - 1 - j])diff++;elsecnt1 += grid[m / 2][j] * 2;}}if (n % 2){// 统计正中间这一列for (int i = 0; i < m / 2; i++){if (grid[i][n / 2] != grid[m - 1 - i][n / 2])diff++;elsecnt1 += grid[i][n / 2] * 2;}}if (cnt1 % 4 == 0){// 把这 diff 对数全部变成 0ans += diff;}else{if (diff){// 把一对数都变成 1,其余全变成 0,要翻转 diff 个数ans += diff;}else{// 把两个 1 翻转为 0ans += 2;}}return ans;}
};
// @lc code=end

复杂度分析

时间复杂度:O(m * n),其中 m 和 n 分别为数组 grid 的行数和列数。

空间复杂度:O(1)。

题目4:3241. 标记所有节点需要的时间

思路

换根DP。

题解:【模板】第二类换根 DP(Python/Java/C++/Go)

代码

/** @lc app=leetcode.cn id=3241 lang=cpp** [3241] 标记所有节点需要的时间*/// @lc code=start
class Solution
{
public:vector<int> timeTaken(vector<vector<int>> &edges){vector<vector<int>> g(edges.size() + 1);for (auto &e : edges){int x = e[0], y = e[1];g[x].push_back(y);g[y].push_back(x);}// nodes[x] 保存子树 x 的最大深度 max_d,次大深度 max_d2,以及最大深度要往儿子 my 走vector<tuple<int, int, int>> nodes(g.size());auto dfs = [&](auto &&dfs, int x, int fa) -> int{int max_d = 0, max_d2 = 0, my = 0;for (int y : g[x]){if (y == fa){continue;}int depth = dfs(dfs, y, x) + 2 - y % 2; // 从 x 出发,往 my 方向的最大深度if (depth > max_d){max_d2 = max_d;max_d = depth;my = y;}else if (depth > max_d2){max_d2 = depth;}}nodes[x] = {max_d, max_d2, my};return max_d;};dfs(dfs, 0, -1);vector<int> ans(g.size());auto reroot = [&](auto &&reroot, int x, int fa, int from_up) -> void{auto &[max_d, max_d2, my] = nodes[x];ans[x] = max(from_up, max_d);for (int y : g[x]){if (y != fa){reroot(reroot, y, x, max(from_up, (y == my ? max_d2 : max_d)) + 2 - x % 2);}}};reroot(reroot, 0, -1, 0);return ans;}
};
// @lc code=end

复杂度分析

时间复杂度:O(n),其中 n 是数组 edges 的长度。

空间复杂度:O(n),其中 n 是数组 edges 的长度。


http://www.ppmy.cn/embedded/103359.html

相关文章

python基础操作

python基础 仅仅打印输出 hello world 是不够的,对吧?你想要做的远不止这些 —— 你想要得到一些输入,操作它并从中得到一些东西。 1. 注释 注释是 # 符号右侧的任何文本,主要用作程序读者的注释。 print(hello world) # 注意,print 是一个函数。或者: #注意,…

DL/T645-2007_Part2(事件记录数据标识编码表)

数据类型分为7类&#xff1a;电能量、最大需量及发生时间、变量、事件记录、参变量、冻结量、负荷记录。 数据标识数据格式数据长度字节)单位功能数据项名称DI₃DI₂DIDI₀读写03 01 00 00 XXXXXX,XXXXXXXXXXXX,XXXXXXXXXXXX,XXXXXX666次&#xff0c;分A相失压总次数&#xf…

linux怎么安装Android Studio

方法一 下载安装包到linux系统解压 tar.gz文件的解压方式为 tar -zxvf 文件名&#xff08;tar -zxvf filename.tar.gz 命令的作用是&#xff0c;使用gzip解压缩&#xff08;-z&#xff09;&#xff0c;解包&#xff08;-x&#xff09;名为filename.tar.gz的归档文件&#xf…

2d椭圆拟合学习

算法来自论文《 Direct Least Square Fitting of Ellipses》 《NUMERICALLY STABLE DIRECT LEAST SQUARES FITTING OF ELLIPSES》 相关文章 论文阅读&#xff1a;直接拟合椭圆 Direct Least Square Fitting of Ellipseshttps://zhuanlan.zhihu.com/p/645391510Fitting Elli…

Docker 的安全优化

目录 1 Docker安全优化思路 1.1 命名空间隔离的安全 1.2 控制组资源控制的安全 1.3 内核能力机制 1.4 Docker服务端防护 1 Docker安全优化思路 Docker容器的安全性&#xff0c;很大程度上依赖于Linux系统自身 评估Docker的安全性时&#xff0c;主要考虑以下几个方面&#xf…

Qt插件开发总结7--插件通信升级【多线程通信】

一、前言 在本系列文章&#xff1a;Qt插件开发总结3–插件间通信 一文中详细讲解了&#xff0c;插件-插件通信、插件-主程序通信。 但是这样虽然实现了通信&#xff0c;但是存在一定的弊端&#xff0c;之前的通信结构如下所示&#xff1a; 插件和主程序都必须依靠【插件管理器…

常见协议工作原理 https ARP ICMP DHCP PING

1. HTTPS&#xff08;HyperText Transfer Protocol Secure&#xff09; HTTPS是HTTP的安全版本&#xff0c;它在HTTP和TCP之间加入了SSL/TLS协议层&#xff0c;用于加密数据传输&#xff0c;确保数据的安全性和完整性。 工作原理&#xff1a; 握手&#xff1a;客户端和服务器…

【C++ Primer Plus习题】7.7

问题: 解答: #include <iostream> using namespace std;#define SIZE 10double* fill_array(double* begin, double* end) {for (begin; begin < end; begin){cout << "请输入值:";cin >> *begin;if (cin.fail()){cout << "非法数字…