刷题 图论
面试经典 150 题 - 图
200. 岛屿数量
dfs 标记 visited
class Solution {
public:// dfs 染色const int direction[4][2] = {{-1, 0}, {0, -1}, {1, 0}, {0, 1}};void dfs(vector<vector<char>>& grid, vector<vector<bool>>& visited, int x, int y) {int n = grid.size(), m = grid[0].size();visited[x][y] = true;for (int i = 0; i < 4; ++i) {int new_x = x + direction[i][0], new_y = y + direction[i][1];if (new_x < 0 || new_x >= n || new_y < 0 || new_y >= m || grid[new_x][new_y] == '0' || visited[new_x][new_y] == true) {continue;}visited[new_x][new_y] = true;dfs(grid, visited, new_x, new_y);}}int numIslands(vector<vector<char>>& grid) {int n = grid.size(), m = grid[0].size();vector<vector<bool>> visited(n, vector<bool>(m, false));int ans = 0;for (int i = 0; i < n; ++i) {for (int j = 0; j < m; ++j) {if (grid[i][j] == '1' && visited[i][j] == false) {++ans;// dfs 染色 将相邻区域中的 1 全部标记为 visiteddfs(grid, visited, i, j);}}}return ans;}
};
bfs 标记 visited
class Solution {
public:// bfs 染色const int direction[4][2] = {{-1, 0}, {0, -1}, {1, 0}, {0, 1}};void bfs(vector<vector<char>>& grid, vector<vector<bool>>& visited, int x, int y) {int n = grid.size(), m = grid[0].size();queue<pair<int,int>> que;que.push(make_pair(x, y));visited[x][y] = true;while (!que.empty()) {int cur_x = que.front().first, cur_y = que.front().second;que.pop();for (int i = 0; i < 4; ++i) {int new_x = cur_x + direction[i][0], new_y = cur_y + direction[i][1];if (new_x < 0 || new_x >= n || new_y < 0 || new_y >= m || grid[new_x][new_y] == '0' || visited[new_x][new_y] == true) {continue;}que.push(make_pair(new_x, new_y));visited[new_x][new_y] = true;}}}int numIslands(vector<vector<char>>& grid) {int n = grid.size(), m = grid[0].size();vector<vector<bool>> visited(n, vector<bool>(m, false));int ans = 0;for (int i = 0; i < n; ++i) {for (int j = 0; j < m; ++j) {if (grid[i][j] == '1' && visited[i][j] == false) {++ans;// bfs 染色 将相邻区域中的 1 全部标记为 visitedbfs(grid, visited, i, j);}}}return ans;}
};
⭐️⭐️130. 被围绕的区域
从四周出发进行 bfs
class Solution {
public:// 想法一:// 不被围绕的区域,也即在 bfs 或者 dfs 过程中邻域中出现越界现象// 简单的想法: 在bfs 和 dfs 过程中记录所有坐标 以及 一个标志位// 如果没有出现越界,就将坐标对应的所有值赋值为 'X'// 想法二:// 更简单的想法,直接从边界上的 'O' 处出发即可,将连通域全部标记为visited// 最后遍历 visited 数组即可const int direction[4][2] = {{-1, 0}, {0, -1}, {1, 0}, {0, 1}};void dfs(vector<vector<char>>& grid, vector<vector<bool>>& visited, int x, int y) {int n = grid.size(), m = grid[0].size();visited[x][y] = true;for (int i = 0; i < 4; ++i) {int new_x = x + direction[i][0], new_y = y + direction[i][1];if (new_x < 0 || new_x >= n || new_y < 0 || new_y >= m || grid[new_x][new_y] == 'X' || visited[new_x][new_y] == true) {continue;}visited[new_x][new_y] = true;dfs(grid, visited, new_x, new_y);}}void solve(vector<vector<char>>& grid) {int n = grid.size(), m = grid[0].size();vector<vector<bool>> visited(n, vector<bool>(m, false));for (int i = 0; i < n; ++i) {if (grid[i][0] == 'O' && visited[i][0] == false) {dfs(grid, visited, i, 0);}if (grid[i][m-1] == 'O' && visited[i][m-1] == false) {dfs(grid, visited, i, m-1);}}for (int j = 1; j < m - 1; ++j) {if (grid[0][j] == 'O' && visited[0][j] == false) {dfs(grid, visited, 0, j);}if (grid[n-1][j] == 'O' && visited[n-1][j] == false) {dfs(grid, visited, n-1, j);}}for (int i = 0; i < n; ++i) {for (int j = 0; j < m; ++j) {if (grid[i][j] == 'O' && visited[i][j] == false) {grid[i][j] = 'X';}}}}
};
⭐️⭐️⭐️133. 克隆图
bfs 用哈希表记录节点是否访问过以及与深拷贝之间的对应关系
// 题目要求返回 图 的深拷贝
// 所谓深拷贝,也即需要新建一个节点,而不是使用原始节点,只是和原始节点的值相同
class Solution {
public:Node* cloneGraph(Node* node) {if (node == nullptr) return nullptr;Node* new_node = new Node(node->val);queue<Node*> que;unordered_map<Node*, Node*> map;que.push(node);map[node] = new_node;while (!que.empty()) {Node* cur = que.front();que.pop();for (auto next : cur->neighbors) {if (map.find(next) == map.end()) {// 出现新节点 --> 需要创建Node* new_next = new Node(next->val);que.push(next);map[next] = new_next;}map[cur]->neighbors.push_back(map[next]);}}return new_node;}
};
⭐️⭐️399. 除法求值
dfs 寻找可达路径
邻接矩阵和 01 矩阵的区别,一个使用 unordered_set 标记是否走过,一个使用 visited 矩阵标记是否走过
class Solution {
public:// 本题也即构建一个无向图,查找 节点之间 存在的路径// 查找路径我们可以使用 dfsstruct Edge {string node;double val;};bool dfs(string& src, string& dst, unordered_map<string, vector<Edge>>& graph, unordered_set<string>& visited, vector<double> &path) {visited.insert(src);if (src == dst) {return true;}for (auto edge : graph[src]) {if (visited.find(edge.node) == visited.end()) {path.push_back(edge.val);if (dfs(edge.node, dst, graph, visited, path)) {return true;}path.pop_back();}}return false;}vector<double> calcEquation(vector<vector<string>>& equations, vector<double>& values, vector<vector<string>>& queries) {// 构建无向图unordered_map<string, vector<Edge>> graph;for (int i = 0; i < equations.size(); ++i) {auto& equation = equations[i];graph[equation[0]].push_back({equation[1], values[i]});graph[equation[1]].push_back({equation[0], 1.0 / values[i]});}// 遍历查询vector<double> result(queries.size(), 0);for (int i = 0; i < queries.size(); ++i) {string& src = queries[i][0], &dst = queries[i][1];if (graph.find(src) == graph.end() || graph.find(dst) == graph.end()) {result[i] = -1.0;continue;}// dfs 寻找路径vector<double> path;unordered_set<string> visited;if (dfs(src, dst, graph, visited, path)) {double ans = 1.0;for (auto p : path) {ans *= p;}result[i] = ans;} else {result[i] = -1;}}return result;}
};
207. 课程表
拓扑排序
class Solution {
public:bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {// 想法:逐个剔除入度为 0 的节点// + 如何获得每个节点的入度?// + 如何剔除节点?// prerequisites[i] = [ai, bi] 说明存在有向边 bi -> ai// 解决方案:可以用一个二维矩阵作为邻接矩阵,再用一个vector存储节点的入度vector<vector<bool>> adj(numCourses, vector<bool>(numCourses, false));vector<int> in_degree(numCourses, 0);queue<int> zero_in_nodes;for (auto& pre : prerequisites) {adj[pre[1]][pre[0]] = true;in_degree[pre[0]]++;}for (int i = 0; i < numCourses; ++i) {if (in_degree[i] == 0) {zero_in_nodes.push(i);}}while (!zero_in_nodes.empty()) {// 找到入度为0的节点int x = zero_in_nodes.front();zero_in_nodes.pop();// 删除节点for (int i = 0; i < numCourses; ++i) {if (adj[x][i]) {adj[x][i] = false;adj[i][x] = false;if (--in_degree[i] == 0) {zero_in_nodes.push(i);}}}}for (int i = 0; i < numCourses; ++i) {if (in_degree[i] > 0) {return false;}}return true;}
};
⭐️⭐️210. 课程表 II
class Solution {
public:// 和课程表 1 是一样的// 逐渐剔除入度为0的节点vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {vector<int> result;// 统计入度vector<int> in_degree(numCourses, 0);for (auto& prerequisite : prerequisites) {in_degree[prerequisite[1]]++;}// 统计邻接表: 删除节点的时候需要根据邻接表更新指向节点的入度vector<vector<int>> adj(numCourses);for (auto& prerequisite : prerequisites) {adj[prerequisite[0]].push_back(prerequisite[1]);}// 初始化队列,存储入度为0的节点queue<int> que;for (int i = 0; i < numCourses; ++i) {if (in_degree[i] == 0) {que.push(i);}}// 遍历队列while (!que.empty()) {// 将入度为0节点弹出队列int node_from = que.front();que.pop();result.push_back(node_from);// 根据邻接表更新入度,入度为0加入队列for (auto& node_to : adj[node_from]) {if (--in_degree[node_to] == 0) {que.push(node_to);}}}if (result.size() == numCourses) {std::reverse(result.begin(), result.end());} else {return std::vector<int>{};}return result;}
};
面试经典 150 题 - 图的广度优先搜索 - 最短路径
⭐️⭐️909. 蛇梯棋
bfs 最短路径长度:在队列中记录 step / 使用parent 数组
bfs
找最短路径 需要使用parent
数组来进行回溯
- 题目中的梯子和蛇 只是起到
传送
作用而已,也即掷完骰子后如果到达一个梯子的起点就需要手动执行传送next = adj[next]
class Solution {
public:int snakesAndLadders(vector<vector<int>>& board) {int n = board.size();vector<int> adj(n * n + 1, -1);// 构建 adj 数组,映射每个位置对应的蛇或梯子int label = 1;for (int i = n - 1; i >= 0; --i) {if ((n - 1 - i) % 2 == 0) {for (int j = 0; j < n; ++j) {if (board[i][j] != -1) {adj[label] = board[i][j];}++label;}} else {for (int j = n - 1; j >= 0; --j) {if (board[i][j] != -1) {adj[label] = board[i][j];}++label;}}}// BFS 进行最短路径搜索vector<bool> visited(n * n + 1, false);vector<int> parent(n * n + 1, -1); // 记录每个节点的父节点,用于路径回溯queue<int> que;que.push(1);visited[1] = true;while (!que.empty()) {auto cur = que.front();que.pop();if (cur == n * n) { // 回溯路径int count = 0;int node = cur;while (node != 1) {++count;node = parent[node];}return count;}// 掷骰子for (int i = 1; i <= 6; ++i) {int next = cur + i;if (next > n * n) break;// 如果有梯子或蛇, 则从 next 传送到 adj[next]if (adj[next] != -1) {next = adj[next];}if (!visited[next]) {visited[next] = true;parent[next] = cur; // 记录父节点que.push(next);}}}return -1; // 无法到达终点}
};
⭐️⭐️433. 最小基因变化
bfs 最短路径长度:在队列中记录 step
class Solution {
public:bool check(string& s1, string& s2) {int count = 0;for (int i = 0; i < s1.size(); ++i) {count += (s1[i] != s2[i]);if (count > 1) {return false;}}return true;}// 起始序列不一定在bank中int minMutation(string startGene, string endGene, vector<string>& bank) {// 先检查一下终止序列是否在bank中int n = bank.size();int src = -1, dst = -1;for (int i = 0; i < n; ++i) {if (bank[i] == endGene) {dst = i;}if (bank[i] == startGene) {src = i;}}if (dst == -1) return -1;if (src == -1) src = n;// 构建邻接表vector<vector<int>> adj(n + 1);// src 到 bank 是单向的if (src == n) {for (int i = 0; i < n; ++i) {if (check(startGene, bank[i])) {adj[n].push_back(i);}}}for (int i = 0; i < n - 1; ++i) {for (int j = i + 1; j < n; ++j) {if (check(bank[i], bank[j])) {adj[i].push_back(j);adj[j].push_back(i);}}}// bfs 搜索路径长度vector<bool> visited(n + 1, false);queue<pair<int, int>> que;que.push({src, 0});visited[src] = true;while (!que.empty()) {auto [cur, step] = que.front();if (cur == dst) {return step;}que.pop();for (auto& next : adj[cur]) {if (visited[next] == false) {que.push({next, step + 1});visited[next] = true;}}}return -1;}
};
双向bfs:两边分别使用一个visited数组记录path长度,根据两个visited数组来判断是否,优先扩展较小的搜索方向
通过设置条件,当某一方向的队列长度显著小于另一方向时,可以优先展开该方向的搜索,避免不必要的广度扩展。
class Solution {
public:bool check(const string& s1, const string& s2) {int count = 0;for (int i = 0; i < s1.size(); ++i) {if (s1[i] != s2[i] && ++count > 1) {return false;}}return true;}int minMutation(string startGene, string endGene, vector<string>& bank) {int n = bank.size();int src = -1, dst = -1;// 提前记录起点和终点for (int i = 0; i < n; ++i) {if (bank[i] == endGene) dst = i;if (bank[i] == startGene) src = i;}if (dst == -1) return -1;if (src == -1) src = n; // 起始序列不在 bank 中// 构建邻接表,减少不必要的 check 调用vector<vector<int>> adj(n + 1);if (src == n) {for (int i = 0; i < n; ++i) {if (check(startGene, bank[i])) {adj[n].push_back(i);}}}for (int i = 0; i < n; ++i) {for (int j = i + 1; j < n; ++j) {if (check(bank[i], bank[j])) {adj[i].push_back(j);adj[j].push_back(i);}}}// 使用双向 BFSvector<int> visited_forward(n + 1, -1);vector<int> visited_back(n + 1, -1);queue<pair<int, int>> que_forward;queue<pair<int, int>> que_back;que_forward.push({src, 0});que_back.push({dst, 0});visited_forward[src] = 0;visited_back[dst] = 0;// 优化 BFS 方向的扩展while (!que_forward.empty() && !que_back.empty()) {// 优先扩展较小的搜索方向if (que_forward.size() <= que_back.size()) {auto [cur, steps] = que_forward.front();que_forward.pop();for (int next : adj[cur]) {if (visited_forward[next] == -1) {visited_forward[next] = steps + 1;if (visited_back[next] != -1) {return visited_forward[next] + visited_back[next];}que_forward.push({next, steps + 1});}}} else {auto [cur, steps] = que_back.front();que_back.pop();for (int next : adj[cur]) {if (visited_back[next] == -1) {visited_back[next] = steps + 1;if (visited_forward[next] != -1) {return visited_forward[next] + visited_back[next];}que_back.push({next, steps + 1});}}}}return -1;}
};
127. 单词接龙
和最小基因变化是一样的,只不过长度需要加1,不成立的话返回0而不是-1
相关文章:

刷题 图论
面试经典 150 题 - 图 200. 岛屿数量 dfs 标记 visited class Solution { public:// dfs 染色const int direction[4][2] {{-1, 0}, {0, -1}, {1, 0}, {0, 1}};void dfs(vector<vector<char>>& grid, vector<vector<bool>>& visited, int x…...

基于JAVA的鲜花商城管理系统(源码+定制+讲解)鲜花商城管理系统、鲜花商城管理平台、鲜花商城信息管理、鲜花商城系统开发与应用、鲜花在线商城管理系统
博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…...

深圳大学-Java程序设计-选实验1 基础知识练习
实验目的与要求: 实验目的:掌握Java程序设计开发环境的搭建,编写简单Java Project,掌握编译、运行等基本步骤和命令。 实验要求: (1).下载、安装"Java SE Development Kit 20.0.2"最新的版本,需…...
第 33 章 Ajax
第 33 章 Ajax 1.XMLHttpRequest 2.GET 与 POST 3.封装 Ajax 2005 年 Jesse James Garrett 发表了一篇文章,标题为:“Ajax:A new Approach to Web Applications”。他在这篇文章里介绍了一种技术,用他的话说,就叫&…...
LeetCode 209 Minimum Size Subarray Sum 题目解析和python代码
题目: Given an array of positive integers nums and a positive integer target, return the minimal length of a subarray whose sum is greater than or equal to target. If there is no such subarray, return 0 instead. Example 1: Input: target 7, nu…...

C# 入坑JAVA 潜规则 注解 列表 listMch,该列表存储了一个映射(Map)的集合 等 入门系列3
java 项目结构 文件说明 潜规则 java入门-CSDN博客 C# 入坑JAVA 潜规则 大小写敏感文件名和类名 枚举等 入门系列2-CSDN博客 java注解 好像和C# 特性 差不多 Data Builder NoArgsConstructor AllArgsConstructor 在Java中,Data、Builder、NoArgsConstructor和Al…...
2024年9月个人工作生活总结
本文为 2024年9月工作生活总结。 研发编码 vuepress构建的几个问题 某vuepress项目,是我在3年多以前自行构想自行着手搞的,主要用于将一些常用的数据文件(markdown样式)渲染成html网页文件,在自建服务程序里开启访问…...
JVM有哪些参数以及如何使用
JVM(Java虚拟机)参数用于调整和优化Java应用程序的性能和行为。这些参数主要分为标准参数、非标准参数(以-X开头)和高级参数(以-XX开头)。以下是一些常见的JVM参数及其使用方法: 标准参数 -se…...

STM32编码器接口解析及抗噪声措施探讨
1. 引言 在现代控制系统中,编码器扮演着非常重要的角色。它就像一个精密的测量工具,可以告诉我们机械部件的位置和运动状态。在STM32微控制器中,编码器接口可以轻松地与各种编码器连接,实现精确的控制。我将在这里探讨STM32编码器…...

微软发布Windows 11 2024更新,新型Copilot+ AI PC功能亮相
前言 微软在Windows 11的2024更新中加强了对人工智能的应用,推出了新功能Copilot。 此次更新的版本号为26100.1742,Copilot将首先在Windows Insider中推出,计划于11月向特定设备和市场推广,用户需开启“尽快获取最新更新”选项以…...
鹏哥C语言68-70---位操作符+单目操作符+关系操作符
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include <time.h> //--------------------------------------------------------------------------------------------------------4.位操作符 // &----按(2进制…...

showdoc二次开发
showdoc用的vue版本老,需要安装老版本nodejs,比如node 14.21.3 win32-x64-93_binding.node问题 https://github.com/sass/node-sass/releases 下载 web_src\node_modules\node-sass\vendor\win32-x64-93 下面重命名为binding.node 代理到php后端&…...

力扣16~20题
题16(中等): 思路: 双指针法,和15题差不多,就是要排除了,如果total<target则排除了更小的(left右移),如果total>target则排除了更大的(rig…...

Pikachu-Sql-Inject -基于boolian的盲注
基于boolean的盲注: 1、没有报错信息显示; 2、不管是正确的输入,还是错误的输入,都只显示两种情况,true or false; 3、在正确的输入下,输入and 1 1/and 1 2发现可以判断; 布尔盲注常用函数&…...
最后30天,你的系统集成项目管理工程师备考进度到哪儿了?
十一长假归来好! 此次归来之后,2024年下半年软考倒计时就从4字头切换到了3字头,今天距离考试还有32天! 那么问题来了,临近考试还有30天左右的时候,你的备考进度到哪里了呢? 其实无论目前你的实际…...
网络安全事件的发生,主要原因是什么
网络安全事件的发生,主要原因涉及多个方面,包括技术漏洞、人为因素、经济利益驱动、恶意软件和病毒威胁、社会工程学攻击、内部人员恶意行为、供应链安全问题以及法律法规的不完善等。以下是对这些原因的详细分析: 技术漏洞: 软件…...

【leetcode】274.H指数
为了方便,将 citations 记为 cs。 所谓的 h 指数是指一个具体的数值,该数值为“最大”的满足「至少发表了 x 篇论文,且每篇论文至少被引用 x 次」定义的合法数,重点是“最大”。 用题面的实例 1 来举个 🌰࿰…...

1.Python 引入(字面量、注释、变量、数据类型、数据类型转换、标识符、运算符、字符串扩展)
一、字面量 1、基本介绍 在代码中,被写直接下来的、不需要通过变量存储的值,称之为字面量 2、常用值类型 类型说明数字(Number)整数(int),例如:10、-10浮点数(float&…...
【AI知识点】梯度消失(Vanishing Gradient)和梯度爆炸(Exploding Gradient)
梯度消失(Vanishing Gradient) 和梯度爆炸(Exploding Gradient) 是神经网络训练中的常见问题,特别是在深层神经网络(DNN)或递归神经网络(RNN)中。这两者主要与反向传播算…...
在 ArkTS 网络请求中,重新封装一下 http 模块
在ArkTS中,重新封装http模块可以提供一个更简洁、更易于使用的API,同时隐藏底层细节,使开发者能够更专注于业务逻辑。以下是一个简单的示例,展示了如何重新封装鸿蒙系统的kit.NetworkKit中的http模块: // 创建一个新的…...

SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...

C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...
在树莓派上添加音频输入设备的几种方法
在树莓派上添加音频输入设备可以通过以下步骤完成,具体方法取决于设备类型(如USB麦克风、3.5mm接口麦克风或HDMI音频输入)。以下是详细指南: 1. 连接音频输入设备 USB麦克风/声卡:直接插入树莓派的USB接口。3.5mm麦克…...
MySQL 主从同步异常处理
阅读原文:https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主,遇到的这个错误: Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一,通常表示ÿ…...
git: early EOF
macOS报错: Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/ remote: Enumerating objects: 2691797, done. remote: Counting objects: 100% (1760/1760), done. remote: Compressing objects: 100% (636/636…...