刷题 - 图论

1 | bfs/dfs | 网格染色

200. 岛屿数量

  • 访问到马上就染色(将visited标为 true)
  • auto [cur_x, cur_y] = que.front(); 结构化绑定(C++17)
  • 也可以不使用 visited数组,直接修改原始数组
  • 时间复杂度: O(n * m),最多将 visited 数组全部标为 true
  • 空间复杂度:考虑visited 数组的话就是 O(n*m), 原地修改就是 O(min(n, m)) 只考虑递归栈深度(DFS)或队列最大深度(BFS),栈深度或队列最多为网格的一边大小

在这里插入图片描述

[模板][dfs][染色]

class Solution {
public:const int direction[4][2] = {{-1, 0}, {0, -1}, {1, 0}, {0, 1}};// 为什么 dfs 看起来好像没有终止条件?因为已经通过代码保证传入的节点都是合法节点void dfs(vector<vector<char>>& grid, vector<vector<bool>>& visited, int x, int y) {for (int i = 0; i < 4; ++i) {int next_x = x + direction[i][0], next_y = y + direction[i][1];if (next_x < 0 || next_x >= grid.size() || \next_y < 0 || next_y >= grid[0].size() || \grid[next_x][next_y] == '0' || \visited[next_x][next_y] == true) {continue;}visited[next_x][next_y] = true;dfs(grid, visited, next_x, next_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;visited[i][j] = true;dfs(grid, visited, i, j);}}}return ans;}
};
class Solution {
public:const int direction[4][2] = {{-1, 0}, {0, -1}, {1, 0}, {0, 1}};// 不管节点是否合法,上来就dfs,然后在终止条件的地方进行判断// 效率会略低一些void dfs(vector<vector<char>>& grid, vector<vector<bool>>& visited, int x, int y) {if (grid[x][y] == '0' || visited[x][y]) return;visited[x][y] = true;for (int i = 0; i < 4; ++i) {int next_x = x + direction[i][0], next_y = y + direction[i][1];if (next_x < 0 || next_x >= grid.size() || \next_y < 0 || next_y >= grid[0].size()) {continue;}dfs(grid, visited, next_x, next_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(grid, visited, i, j);}}}return ans;}
};

[模板][bfs][染色]

class Solution {
public: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) {queue<pair<int,int>> que;visited[x][y] = true;   // 在加入队列之前将其标为访问过que.push(make_pair(x, y));while (!que.empty()) {auto [cur_x, cur_y] = que.front();  // 结构化绑定que.pop();for (int i = 0; i < 4; ++i) {int next_x = cur_x + direction[i][0], next_y = cur_y + direction[i][1];if (next_x < 0 || next_x >= grid.size() || \next_y < 0 || next_y >= grid[0].size() || \grid[next_x][next_y] == '0' || \visited[next_x][next_y] == true) {continue;}visited[next_x][next_y] = true;que.push(make_pair(next_x, next_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;bfs(grid, visited, i, j);}}}return ans;}
};

在这里插入图片描述

类似题目

695. 岛屿的最大面积

在 染色的时候统计面积即可

visited[next_x][next_y] = true;
++area;

130. 被围绕的区域

在这里插入图片描述

两个步骤:

  • 从地图周边出发,将 ‘O’ 都做上标记,visited = true
  • 然后再遍历一遍地图,遇到 ‘O’ 且没做过标记的,那么都是地图中间的 ‘O’ ,全部改成 ‘X’ 就行

417. 太平洋大西洋水流问题

在这里插入图片描述

class Solution {
public:// 太平洋:i == 0 || j == 0// 大西洋:i == m-1 || j == n-1// 方式1:从每个节点出发,如果可以到达太平洋且大西洋,记录结果// 方式2:从四周出发,逆向找可达节点int direction[4][2] = {-1, 0, 0, -1, 1, 0, 0, 1};// array<array<int, 2>, 4> direction = {-1, 0, 0, -1, 1, 0, 0, 1};void dfs(const vector<vector<int>>& heights, vector<vector<bool>>& visited, int x, int y) {for (int i = 0; i < 4; ++i) {int next_x = x + direction[i][0], next_y = y + direction[i][1];if (next_x < 0 || next_x >= heights.size() || \next_y < 0 || next_y >= heights[0].size() || \visited[next_x][next_y] == true ||heights[next_x][next_y] < heights[x][y]) {continue;}visited[next_x][next_y] = true;dfs(heights, visited, next_x, next_y);}}vector<vector<int>> pacificAtlantic(vector<vector<int>>& heights) {int m = heights.size(), n = heights[0].size();vector<vector<bool>> pacific_visited(m, vector<bool>(n, false));vector<vector<bool>> atlantic_visited(m, vector<bool>(n, false));for (int i = 0; i < n; ++i) {if (pacific_visited[0][i] == false) {pacific_visited[0][i] = true;dfs(heights, pacific_visited, 0, i);}}for (int i = 1; i < m; ++i) {if (pacific_visited[i][0] == false) {pacific_visited[i][0] = true;dfs(heights, pacific_visited, i, 0);}}for (int i = 0; i < n; ++i) {if (atlantic_visited[m-1][i] == false) {atlantic_visited[m-1][i] = true;dfs(heights, atlantic_visited, m-1, i);}}for (int i = 0; i < m - 1; ++i) {if (atlantic_visited[i][n-1] == false) {atlantic_visited[i][n-1] = true;dfs(heights, atlantic_visited, i, n-1);}}vector<vector<int>> result;for (int i = 0; i < m; ++i) {for (int j = 0; j < n; ++j) {if (pacific_visited[i][j] && atlantic_visited[i][j]) {result.push_back({i,j});}}}return result;}
};

建造最大工岛

在这里插入图片描述

2 | bfs | 无权最短路径

  • 如果只需要路径长度,每次先获取队列的长度然后再往外扩展,或者可以采用使用 int 类型的 visited 数组来记录路径长度
  • 如果需要输出路径,需要记录节点的 前驱节点,最后从终点到起点获取前驱节点从而输出路径

[模板] 获取最短路径长度 - 记录steps

int bfs_shortest_path_length(const vector<vector<int>>& graph, int start, int goal) {int n = graph.size(); // 节点的总数queue<int> q; // 队列用于BFSvector<bool> visited(n, false); // 记录已经访问过的节点q.push(start);visited[start] = true;int steps = 0; // 用于记录步数while (!q.empty()) {int que_size = q.size();while (que_size--) {int node = q.front();q.pop();if (node == goal) {return steps;}for (int neighbor : graph[node]) {if (!visited[neighbor]) {visited[neighbor] = true;q.push(neighbor);}}}++steps;}return -1;
}

[模板] 获取最短路径 - 记录前驱节点

// 使用BFS寻找从start到goal的最短路径,并使用前驱数组记录路径
vector<int> bfs_shortest_path(const vector<vector<int>>& graph, int start, int goal) {int n = graph.size(); // 节点的总数vector<int> prev(n, -1); // 用于记录前驱节点,初始化为-1表示未访问queue<int> q; // 队列用于BFSunordered_set<int> visited; // 记录已经访问过的节点// 初始化BFSq.push(start);visited.insert(start);// 开始BFSwhile (!q.empty()) {int node = q.front();q.pop();// 如果找到了目标节点,回溯路径if (node == goal) {vector<int> path;for (int at = goal; at != -1; at = prev[at]) {path.push_back(at);}reverse(path.begin(), path.end());return path; // 返回从start到goal的路径}// 遍历当前节点的所有邻居for (int neighbor : graph[node]) {if (visited.find(neighbor) == visited.end()) {// 如果邻居节点未被访问,标记为已访问并记录前驱节点visited.insert(neighbor);prev[neighbor] = node;q.push(neighbor);}}}// 如果没有找到路径,返回空路径return {};
}

类似题目

[最短路径长度]1926. 迷宫中离入口最近的出口

在这里插入图片描述

class Solution {
public:int nearestExit(vector<vector<char>>& maze, vector<int>& entrance) {int m = maze.size(), n = maze[0].size();int x = entrance[0], y = entrance[1];queue<pair<int, int>> que;maze[x][y] = '+';que.push({x, y});// 定义四个方向:上、下、左、右const int dir[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};int steps = 0;// 广度优先搜索while (!que.empty()) {int q_size = que.size();for (int i = 0; i < q_size; ++i) {auto [cur_x, cur_y] = que.front();que.pop();for (int d = 0; d < 4; ++d) {int next_x = cur_x + dir[d][0];int next_y = cur_y + dir[d][1];// 检查边界条件if (next_x < 0 || next_x >= m || \next_y < 0 || next_y >= n || \maze[next_x][next_y] == '+') {continue;}// 如果到达边界并且不是入口,返回步数if (next_x == 0 || next_x == m - 1 ||\next_y == 0 || next_y == n - 1) {return steps + 1;}// 标记为已访问,并将其加入队列maze[next_x][next_y] = '+';que.push({next_x, next_y});}}++steps;}// 如果没有找到出口,返回 -1return -1;}
};

[最短路径长度] 433. 最小基因变化

在这里插入图片描述

class Solution {
public:bool canConvert(const string& s1, const string& s2) {int diffCount = 0;for (int i = 0; i < s1.size(); ++i) {if (s1[i] != s2[i]) {if (++diffCount > 1) return false;}}return true;}int minMutation(string startGene, string endGene, vector<string>& bank) {if (startGene == endGene) return 0;int n = bank.size();int startIndex = -1, endIndex = -1;// 查找 startGene 和 endGene 在 bank 中的位置for (int i = 0; i < n; ++i) {if (bank[i] == endGene) endIndex = i;else if (bank[i] == startGene) startIndex = i;}// 如果终止基因不在 bank 中,直接返回 -1if (endIndex == -1) return -1;// 如果起始基因不在 bank 中,则将其作为附加节点处理if (startIndex == -1) startIndex = n;// 构建邻接表vector<list<int>> adj(n + 1);// 如果 startGene 不在 bank 中,构造与它相邻的节点if (startIndex == n) {for (int i = 0; i < n; ++i) {if (canConvert(startGene, bank[i])) {adj[n].push_back(i);}}}// 构造 bank 中基因的邻接关系for (int i = 0; i < n; ++i) {for (int j = i + 1; j < n; ++j) {if (canConvert(bank[i], bank[j])) {adj[i].push_back(j);adj[j].push_back(i);}}}// BFS 进行最短路径搜索queue<int> q;vector<bool> visited(n + 1, false);q.push(startIndex);visited[startIndex] = true;int steps = 0;while (!q.empty()) {int que_size = q.size();while (que_size--) {int node = q.front();q.pop();// 找到终止基因,返回步数if (node == endIndex) return steps;// 遍历邻居节点for (int neighbor : adj[node]) {if (!visited[neighbor]) {visited[neighbor] = true;q.push(neighbor);}}}++steps; // 每一轮BFS增加一步}// 如果找不到转换路径,返回 -1return -1;}
};

[最短路径长度]127. 单词接龙

在这里插入图片描述

和最小基因变化基本没区别

3 | dfs | 回溯 | 所有可能路径

[模板] 797. 所有可能的路径

  • 本题为有向无环图,如果存在环的话需要加一个 visited 数组
  • 时间复杂度:O(2^n),最坏情况下可能有 2 的 n 次方条路径,其中 n 是图的节点数。
  • 空间复杂度:O(n),递归深度最深为 n(即从 0 到目标节点的最长路径长度),以及存储路径所需的空间。
// 有向无环图求所有可行路径
// 如果存在环的话需要加一个 visited 数组
class Solution {
public:vector<vector<int>> result;vector<int> path;void dfs(vector<vector<int>>& graph, int start) {if (start == graph.size() - 1) {result.push_back(path);}for (auto& next : graph[start]) {path.push_back(next);dfs(graph, next);path.pop_back();}}vector<vector<int>> allPathsSourceTarget(vector<vector<int>>& graph) {path.push_back(0);dfs(graph, 0);return result; }
};

4 | 并查集 | 判断节点相连

[模板][有向图][无向图]

  • 并查集初始化:将所有节点的根节点初始化为节点本身
  • 在查询父节点的时候要执行路径压缩

有向边: 按方向合并

    struct UnionSet {vector<int> root;UnionSet(int n) : root(n, 0) {for (int i = 0; i < n; ++i) {root[i] = i;}}int Find(int u) {if (u == root[u]) return u;root[u] = Find(root[u]); // 路径压缩return root[u];}bool IsConnected(int u, int v) {return Find(u) == Find(v);}void Join(int u, int v) {int root_u = Find(u);int root_v = Find(v);root[root_v] = root_u;}};

无向边:按秩合并

  • 在并查集(Union-Find)的按秩合并中,通常用于表示树的高度(或深度)
  • 插入新连接的时候选择秩小的作为根节点
    在这里插入图片描述
  • 如果二者秩相同,秩需要加一
    在这里插入图片描述
struct UnionSet{vector<int> root;vector<int> rank;UnionSet(int n) : root(n, 0), rank(n, 1) {for (int i = 0; i < n; ++i) {root[i] = i;}}int Find(int u) {if (u == root[u]) return u;root[u] = Find(root[u]); // 路径压缩return root[u];}bool IsConnected(int u, int v) {return Find(u) == Find(v);}void Join(int u, int v) {int root_u = Find(u);int root_v = Find(v);if (rank[root_u] > rank[root_v]) {root[root_v] = root_u;} else if (rank[root_u] < rank[root_v]) {root[root_u] = root_v;} else {root[root_u] = root_v;rank[root_v]++;}}
};

类似题目

[无向边]684. 冗余连接

在这里插入图片描述

如果边的两个节点已经出现在同一个集合里,说明这条边的两个节点已经连在一起了,再加入这条边一定就出现环了。

    vector<int> findRedundantConnection(vector<vector<int>>& edges) {int n = edges.size();UnionSet union_set(n + 1);for (auto& edge : edges) {int u = edge[0], v = edge[1];if (union_set.IsConnected(u, v)) {return {u, v};} else {union_set.Join(u, v);}}return {};}

[有向边]685. 冗余连接 II

参考链接:【困难题简单做】分类讨论+并查集,击破hard
在这里插入图片描述

class Solution {
public:// 查找冗余的有向边vector<int> findRedundantDirectedConnection(vector<vector<int>>& edges) {int n = edges.size();vector<int> parent(n + 1, 0);vector<int> edge_to_remove1, edge_to_remove2;int two_in_node = -1;// 检测入度为2的情况for (auto& edge : edges) {int u = edge[0], v = edge[1];if (parent[v] == 0) {parent[v] = u;} else {// 发现入度为2的节点 vtwo_in_node = v;edge_to_remove1 = {parent[v], v}; // 之前的边edge_to_remove2 = {u, v}; // 当前的边break;}}// 重建并查集,处理有环的情况UnionSet union_set(n + 1);for (auto& edge : edges) {int u = edge[0], v = edge[1];if (edge == edge_to_remove2) {// 跳过第二条边,先验证第一条边continue;}if (union_set.IsConnected(u, v)) {// 出现环//  + 如果不存在入度为2的节点,只需要考虑环的问题//  + 说明正是[u,v]导致环的出现,删除 [u, v] 即可    if (two_in_node == -1) return edge;//  + 存在入度为 2 的节点//  + edge_to_remove1 必然属于这个环的一部分//  + 否则就会出现两条不合法的边了,不合题意//  + 因此我们删除两个不合法的交集,也即 edge_to_remove1return edge_to_remove1;}union_set.Join(u, v);}// 循环正常结束,说明没有出现环// 说明异常情况为:存在入度为 2 的节点// 删除最后一条导致入度为 2 的边,也即 edge_to_remove2return edge_to_remove2;}
};

5 | 拓扑排序 | 有向图 | 判断是否有环 | 无环图线性排序

[模板]207. 课程表

  • 遍历所有边,记录所有节点的入度,将入度为 0 的节点加入队列和结果数组
  • 当队列不为空时,从队列中弹出节点,遍历节点的所有邻居,将邻居的入度减1,如果此时邻居的入度为0,则将该邻居加入队列和结果数组
  • 队列为空,若结果数组的长度不等于节点个数,说明存在环,否则返回结果数组
class Solution {
public:bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {vector<int> indegrees(numCourses, 0);vector<list<int>> adj(numCourses);for (const auto& pre : prerequisites) {++indegrees[pre[0]];adj[pre[1]].push_back(pre[0]);}int count = 0;queue<int> que;for (int i = 0; i < numCourses; ++i) {if (indegrees[i] == 0) {que.push(i);++count;}}while (!que.empty()) {int cur = que.front();que.pop();for (auto next : adj[cur]) {if (--indegrees[next] == 0) {que.push(next);++count;}}}return (count == numCourses);}
};

6 | Dijistra | 带正权图最短路径

[模板]参加科学大会

  • 使用 堆来存储当前最短路径节点 {节点到起点的距离, 节点索引}
  • 每次从优先队列中选择当前距离最小的未处理节点
#include <iostream>
#include <vector>
#include <queue>
#include <climits>
#include <list>
using namespace std;int dijkstra(vector<list<pair<int, int>>>& adj_list) {int n = adj_list.size() - 1; int start = 1, end = n;vector<int> costs(n + 1, INT_MAX);	// 记录距离vector<int> visited(n + 1, false);	// 标记是否找到最短路		// 堆存储 {节点到起点的距离,节点索引}priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;// 初始化costs[start] = 0;pq.push({0, start});while (!pq.empty()) {// 每次从优先队列中选择当前距离最小的未处理节点int cost = pq.top().first;int cur = pq.top().second;pq.pop();if (visited[cur]) continue;	// 节点已经访问过,跳过visited[cur] = true;			// 未访问过,标记为访问过if (cur == end) return costs[end];	// 到达终点// 遍历相邻节点for (auto& [next, time] : adj_list[cur]) {if (!visited[next] && costs[cur] + time < costs[next]) {// 找到更短的路径了   costs[next] = costs[cur] + time;pq.push({costs[next], next});}}}return -1;  // 如果没有路径到达终点
}int main(int argc, char* argv[]) {if (argc == 1) return -1;freopen(argv[1], "r", stdin);int n, m;cin >> n >> m;  // n 个 车站 m 条公路vector<list<pair<int, int>>> adj_list(n + 1);for (int i = 0; i < m; ++i) {   // 输入 m 条边:起点 终点 和 时间int start, end, time;cin >> start >> end >> time;adj_list[start].push_back({end, time});}cout << dijkstra(adj_list) << endl;return 0;
}

7 | Floyd | 多源最短路 | 动态规划 | 适合稠密图且源点较多

[模板]97. 小明逛公园

在这里插入图片描述
在这里插入图片描述

#include <iostream>
#include <vector>
#include <list>
#include <climits>
using namespace std;int main() {int n, m, p1, p2, val;cin >> n >> m;vector<vector<vector<int>>> grid(n + 1, vector<vector<int>>(n + 1, vector<int>(n + 1, INT_MAX)));  // 因为边的最大距离是10^4for(int i = 0; i < m; i++){cin >> p1 >> p2 >> val;grid[p1][p2][0] = val;grid[p2][p1][0] = val; // 注意这里是双向图}// 开始 floydfor (int k = 1; k <= n; k++) {for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {if (grid[i][k][k-1] == INT_MAX || grid[k][j][k-1] == INT_MAX) {grid[i][j][k] = grid[i][j][k-1];} else {grid[i][j][k] = min(grid[i][j][k-1], grid[i][k][k-1] + grid[k][j][k-1]);}      }}}// 输出结果int z, start, end;cin >> z;while (z--) {cin >> start >> end;if (grid[start][end][n] == INT_MAX) cout << -1 << endl;else cout << grid[start][end][n] << endl;}
}

空间优化

#include <iostream>
#include <vector>
#include <list>
#include <climits>
using namespace std;int main() {int n, m, p1, p2, val;cin >> n >> m;vector<vector<int>> grid(n + 1, vector<int>(n + 1, INT_MAX));  // 因为边的最大距离是10^4for(int i = 0; i < m; i++){cin >> p1 >> p2 >> val;grid[p1][p2] = val;grid[p2][p1] = val; // 注意这里是双向图}// 开始 floydfor (int k = 1; k <= n; k++) {for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {if (grid[i][k] != INT_MAX && grid[k][j] != INT_MAX) {grid[i][j] = min(grid[i][j], grid[i][k] + grid[k][j]);}      }}}// 输出结果int z, start, end;cin >> z;while (z--) {cin >> start >> end;if (grid[start][end] == INT_MAX) cout << -1 << endl;else cout << grid[start][end] << endl;}
}

8 | Prim | 贪心 | 最小生成树 | 花最小的代价连通所有的点

[模板] 53. 寻宝(第七期模拟笔试)

图-最小生成树-Prim(普里姆)算法和Kruskal(克鲁斯卡尔)算法

#include<iostream>
#include<vector>
#include <climits>using namespace std;int main() {int v, e;   // 顶点数和边数cin >> v >> e;vector<vector<int>> grid(v + 1, vector<int>(v + 1, INT_MAX));int x, y, k;    // 起点,终点和权值while (e--) {cin >> x >> y >> k;grid[x][y] = k;grid[y][x] = k;   // 无向图}// Prim算法部分vector<int> minDist(v + 1, INT_MAX);        // 所有节点到最小生成树的最小距离vector<bool> isInTree(v + 1, false);        // 是否已经在最小生成树中minDist[1] = 0;                             // 从第1个节点开始int result = 0;for (int i = 1; i <= v; i++) {int cur = -1;int minVal = INT_MAX;// 找到距离当前生成树最近的节点for (int j = 1; j <= v; j++) {if (!isInTree[j] && minDist[j] < minVal) {minVal = minDist[j];cur = j;}}// 如果没有找到合适的节点,则图不连通if (cur == -1) {cout << "Graph is not connected" << endl;return -1;}isInTree[cur] = true;result += minVal;  // 把该点与生成树相连的最小边的权值加入结果// 更新其他节点到生成树的最短距离for (int j = 1; j <= v; j++) {if (!isInTree[j] && grid[cur][j] != INT_MAX && grid[cur][j] < minDist[j]) {minDist[j] = grid[cur][j];}}}// 输出最小生成树的权重cout << result << endl;return 0;
}

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

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

相关文章

Deepinteraction 深度交互:通过模态交互的3D对象检测

一.前提 为什么要采用跨模态的信息融合? 点云在低分辨率下提供必要的定位和几何信息&#xff0c;而图像在高分辨率下提供丰富的外观信息。 -->因此必须采用跨模态的信息融合 提出的原因? 传统的融合办法可能会由于信息融合到统一表示中的不太完美而丢失很大一部分特定…

磁珠的工作原理:【图文讲解】

1&#xff1a;什么是磁珠 磁珠是一种被动组件&#xff0c;用来抑制电路中的高频噪声。磁珠是一种特别的扼流圈&#xff0c;其成分多半为铁氧体&#xff0c;利用其高频电流产生的热耗散来抑制高频噪声。磁珠有时也称为磁环、EMI滤波器、铁芯等。 磁珠是滤波常用的器件&#xf…

SpringMVC常用注解

RequestMapping接口的映射&#xff0c;可以将HTTP请求映射到控制器方法上&#xff0c;通过这个注解使用不同的映射&#xff0c;就可以区分不同的控制器&#xff0c;其中RequestMapping中还有不同的属性&#xff0c;比如method&#xff0c;params&#xff0c;produces等在这里我…

快速搭建SpringBoot3+Prometheus+Grafana

快速搭建SpringBoot3PrometheusGrafana 一、搭建SpringBoot项目 1.1 创建SpringBoot项目 1.2 修改pom文件配置 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://…

25年山东高考报名时间为10月23日-29日

今日&#xff0c;山东省招生考试院发布关于《山东省2025年普通高等学校招生考试报名工作的通知》 其中高考报名时间定为&#xff1a;2024年10月23日29日&#xff08;每天9&#xff1a;0018&#xff1a;00&#xff09; 资格审查时间为&#xff1a;10月30日~11月11日 网上缴费时间…

Android问题记录 - 适配Android Studio Ladybug/Java 21/AGP 8.0

文章目录 前言开发环境问题描述问题分析1. 适配Java 212. 适配AGP 8.0 解决方案补充内容最后 前言 Android Studio版本从Koala Feature Drop升级到Ladybug&#xff0c;出现了一系列报错。 开发环境 Flutter: 3.24.3Android Studio: 2024.2.1 Patch 1Java: 21.0.3Gradle: 7.4…

FPGA实现PCIE采集电脑端视频转SFP光口万兆UDP输出,基于XDMA+GTX架构,提供2套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的PCIE方案10G Ethernet Subsystem实现万兆以太网物理层方案 3、PCIE基础知识扫描4、工程详细设计方案工程设计原理框图电脑端视频PCIE视频采集QT上位机XDMA配置及使用XDMA中断模块FDMA图像缓存UDP视频组包发送UDP协议栈MAC…

高效改进!防止DataX从HDFS导入关系型数据库丢数据

高效改进&#xff01;防止DataX从HDFS导入关系型数据库丢数据 针对DataX在从HDFS导入数据到关系型数据库过程中的数据丢失问题&#xff0c;优化了分片处理代码。改动包括将之前单一分片处理逻辑重构为循环处理所有分片&#xff0c;确保了每个分片数据都得到全面读取和传输&…

Git文件操作指令和文件状态

一、Git 文件操作指令 1、查看指定文件的状态 git status [filename] 我们在新创建且初始化过后的 git 仓库中新建一个 文件&#xff0c;然后在 git 的命令行中输入此指令后&#xff0c;就可以看到 的状态&#xff1a; 在此显示的是 Untracked 的状态&#xff0c;也就是未…

visual studio设置修改文件字符集方法

该方法来自网文&#xff0c;特此记录备忘。 添加两个组件&#xff0c;分别是Force UTF-8,FileEncoding。 截图如下&#xff1a; 方法如下&#xff1a;vs中点击“扩展”->“管理扩展”&#xff0c;输入utf搜索&#xff0c;安装如下两个插件&#xff0c;然后重启vs&#xf…

【pytorch DistributedDataParallel 及amp 使用过程遇到的问题记录 】

目录 环境问题单机多卡时&#xff1a;超时错误部分报错内容:解决方法: 存在没有使用梯度的参数报错内容:解决方法:方法1 找到不参与梯度计算的层**且**没有用处的层&#xff0c;删除方法2 DistributedDataParallel 增加参数:find_unused_parameters True DDP 训练时第一个batc…

2 两数相加

解题思路&#xff1a; \qquad 这道题可以用模拟很直观的解决&#xff0c;模式加法的计算过程&#xff0c;只不过套了一层链表的外衣。题目给出的数字在链表中是按照逆序排列的&#xff0c;即链表头节点的值代表相加数字的个位&#xff0c;这样只需要从链表头开始计算加法即可得…

系统登录接口文档Demo

接口描述 该接口用于用户登录验证。通过用户名和密码进行身份验证&#xff0c;成功后返回一个用于后续请求的认证 token。这个 token 是访问受保护资源的凭证。 时序图&#xff1a; 登录请求&#xff1a; 登录查询接口: POST {url}/api/user/login 请求体: {"username…

简单的 curl HTTP的POSTGET请求以及ip port连通性测试

简单的 curl HTTP的POST&GET请求以及ip port连通性测试 1. 需求 我们公司有一个演示项目&#xff0c;需要到客户那边进行项目部署&#xff0c;项目部署完成后我们需要进行项目后端接口的测试功能&#xff0c;但是由于客户那边么有条件安装类似于postman这种的测试工具&am…

Linux:进程优先级 进程调度切换 调度算法

#1024程序员节&#xff5c;征文# 目录 1.进程优先级 1.1 概念 1.2 为什么有优先级 1.3 Linux进程优先级 2. 概念预备 2.1 并发 2.2 寄存器 主要类型&#xff1a; 2. 进程的调度与切换 3.1 进程调度 3.2 进程切换 4. 调度算法 4.1 runqueue内部结构 4.2 如何调度…

Git使用GUI界面实现任意历史版本对比

首先进入版本历史查看界面 标记某次提交 选择某次提交并和标记的提交对比 可以查看比较结果了&#xff0c;具体到每一个文件每一行代码

一篇文章快速认识 YOLO11 | 目标检测 | 模型训练 | 自定义数据集

本文分享YOLO11的目标检测&#xff0c;主要内容是自定义数据集、数据标注、标签格式转换、模型训练、模型推理等。 目录 1、数据标注 2、Labelme的json转为YOLO的txt 3、配置YOLO11代码工程 4、数据集yaml配置文件 5、YOLO11模型结构配置文件 6、编写训练代码 7、开始训…

Unity 开发学习笔记(0):

文章目录 前言为什么要去学Unity安装国际版Unity总结 前言 我最近打算学习一下Unity。所以打算从零开始做一下相关的学习笔记。 为什么要去学Unity 上位机的上限就这样&#xff0c;没有运动控制和机器视觉&#xff0c;薪资上不去C# 我非常熟练&#xff0c;所以学习Unity成本…

excel判断某一列(A列)中的数据是否在另一列(B列)中

如B列如果有7个元素&#xff0c;在A列右边的空白列中&#xff0c;输入如下公式&#xff1a; COUNTIF($B$1:$B$7,A1), 其中&#xff0c;$B$1:$B$7代表A列中的所有数据即绝对范围&#xff0c;A1代表B列中的一个单元格.

JVM 加载 class 文件的原理机制

JVM 加载 class 文件的原理机制 JVM&#xff08;Java虚拟机&#xff09;是一个可以执行Java字节码的虚拟机。它负责执行Java应用程序和应用程序的扩展&#xff0c;如Java库和框架。 文章目录 JVM 加载 class 文件的原理机制1. JVM1.1 类加载器1.2 魔数1.3 元空间 2. 类加载2.1 …