vector<int> direction{-1, 0, 1, 0, -1}; intmaxAreaOfIsland(vector<vector<int>>& grid){ int m = grid.size(), n = m ? grid[0].size() : 0; int local_area, area = 0, x, y; for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if (grid[i][j]) { local_area = 1; grid[i][j] = 0; stack<pair<int, int>> island; island.push({i, j}); while (!island.empty()) { auto [r, c] = island.top(); island.pop(); for (int k = 0; k < 4; k++) { x = r + direction[k]; y = c + direction[k+1]; if (x >= 0 && x < m && y >= 0 && y < n && grid[x][y] == 1) { grid[x][y] = 0; local_area++; island.push({x, y}); } } } area = max(area, local_area); } } } return area; }
vector<int> direction{-1, 0, 1, 0, -1}; // 主函数 intmaxAreaOfIsland(vector<vector<int>>& grid){ if (grid.empty() || grid[0].empty()) return0; int max_area = 0; for (int i = 0; i < grid.size(); i++) { for (int j = 0; j < grid[0].size(); j++) { if (grid[i][j] == 1) max_area = max(max_area, dfs(grid, i, j)); } } return max_area; } // 辅函数 intdfs(vector<vector<int>>& grid, int r, int c){ if (grid[r][c] == 0) return0; grid[r][c] = 0; int x, y, area = 1; for (int i = 0; i < 4; i++) { x = r + direction[i]; y = c + direction[i+1]; if (x >= 0 && x < grid.size() && y >= 0 && y < grid[0].size()) area += dfs(grid, x, y); } return area; }
vector<int> direction{-1, 0, 1, 0, -1}; // 主函数 vector<vector<int>> pacificAtlantic(vector<vector<int>>& matrix) { if (matrix.empty() || matrix[0].empty()) return {}; vector<vector<int>> ans; int m = matrix.size(), n = matrix[0].size(); vector<vector<bool>> can_reach_p(m, vector<bool>(n, false)); vector<vector<bool>> can_reach_a(m, vector<bool>(n, false)); for (int i = 0; i < m; i++) { dfs(matrix, can_reach_p, i, 0); dfs(matrix, can_reach_a, i, n - 1); } for (int i = 0; i < n; i++) { dfs(matrix, can_reach_p, 0, i); dfs(matrix, can_reach_a, m - 1, i); } for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if (can_reach_p[i][j] && can_reach_a[i][j]) ans.push_back(vector<int>{i, j}); } } return ans; } // 辅函数 voiddfs(const vector<vector<int>>& matrix, vector<vector<bool>>& can_reach, int r, int c){ if (can_reach[r][c]) return; can_reach[r][c] = true; int x, y; for (int i = 0; i < 4; i++) { x = r + direction[i]; y = c + direction[i+1]; if (x >= 0 && x < matrix.size() && y >= 0 && y < matrix[0].size() && matrix[r][c] <= matrix[x][y]) dfs(matrix, can_reach, x, y); } }
// 主函数 vector<vector<int>> combine(int n, int k) { vector<vector<int>> ans; vector<int> comb(k, 0); int count = 0; backtracking(ans, comb, count, 1, n, k); return ans; } // 辅函数 voidbacktracking(vector<vector<int>>& ans, vector<int>& comb, int& count, int pos, int n, int k){ if (count == k) { ans.push_back(comb); return; } for (int i = pos; i <= n; i++) { comb[count++] = i; backtracking(ans, comb, count, i + 1, n, k); count--; } }
vector<int> direction{-1, 0, 1, 0, -1}; intshortestBridge(vector<vector<int>>& grid){ int m = grid.size(), n = grid[0].size(); queue<pair<int, int>> points; bool flipped = false; //DFS找到第一个岛屿,标记为2 for (int i = 0; i < m; i++) { if (flipped) break; for (int j = 0; j < n; j++) { if (grid[i][j] == 1) { dfs(points, grid, m, n, i, j); flipped = true; break; } } } //BFS,一层层向外扩展至找到第二个岛屿 int x, y; int level = 0; while (!points.empty()){ level++; //n_points每减一,队列里就排除一个,减到0说明往外扩一层还没有找到,层数加一,继续扩 int n_points = points.size(); while (n_points--) { auto [r, c] = points.front(); points.pop(); for (int k = 0; k < 4; k++) { x = r + direction[k]; y = c + direction[k+1]; if (x >= 0 && y >= 0 && x < m && y < n) { if (grid[x][y] == 2) continue; if (grid[x][y] == 1) return level; points.push({x, y}); grid[x][y] = 2; } } } } return0; } voiddfs(queue<pair<int, int>>& points, vector<vector<int>>& grid, int m, int n, int i, int j){ if (i < 0 || j < 0 || i == m || j == n || grid[i][j] == 2) return; //将边界一圈一个个压入队列 if (grid[i][j] == 0) { points.push({i, j}); return; } grid[i][j] = 2; dfs(points, grid, m, n, i - 1, j); dfs(points, grid, m, n, i + 1, j); dfs(points, grid, m, n, i, j - 1); dfs(points, grid, m, n, i, j + 1); }
int n, m; voiddfs(vector<vector<char>>& board, int x, int y){ if (x < 0 || x >= n || y < 0 || y >= m || board[x][y] != 'O') return; board[x][y] = 'A'; dfs(board, x + 1, y); dfs(board, x - 1, y); dfs(board, x, y + 1); dfs(board, x, y - 1); } voidsolve(vector<vector<char>>& board){ n = board.size(); if (n == 0) return; m = board[0].size(); for (int i = 0; i < n; i++) { dfs(board, i, 0); dfs(board, i, m - 1); } for (int i = 1; i < m - 1; i++) { dfs(board, 0, i); dfs(board, n - 1, i); } for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (board[i][j] == 'A') board[i][j] = 'O'; elseif (board[i][j] == 'O') board[i][j] = 'X'; } } }
vector<int> findMinHeightTrees(int n, vector<vector<int>>& edges){ if (n == 1) return {0}; if (n == 2) return {0, 1}; vector<int> degree(n); //每个节点对应的度数 map<int,vector<int>> m; //邻接表 vector<int> ans; //结果 for (int i = 0; i < edges.size(); i++){ int u=edges[i][0]; int v=edges[i][1]; degree[u]++; degree[v]++; m[u].push_back(v); m[v].push_back(u); } queue<int> q; //把叶子节点入队列 for (int i = 0; i < n; i++) if (degree[i] == 1) q.push(i); //从外向内一层一层剥 int k = 0; while (n - k > 2){ int sz=q.size(); for (int i = 0; i < sz; i++){ int t = q.front(); degree[t]--; q.pop(); k++; //加入t的邻接叶子节点 for (auto j : m[t]){ degree[j]--; if (degree[j] == 1) q.push(j); } } } for (int i = 0; i < n - k; i++) { ans.push_back(q.front()); q.pop(); } return ans; }