目录
被围绕的区域
给你一个
m x n
的矩阵board
,由若干字符'X'
和'O'
,找到所有被'X'
围绕的区域,并将这些区域里所有的'O'
用'X'
填充。示例 1:
输入:board = [["X","X","X","X"],["X","O","O","X"],["X","X","O","X"],["X","O","X","X"]] 输出:[["X","X","X","X"],["X","X","X","X"],["X","X","X","X"],["X","O","X","X"]] 解释:被围绕的区间不会存在于边界上,换句话说,任何边界上的'O'
都不会被填充为'X'
。 任何不在边界上,或不与边界上的'O'
相连的'O'
最终都会被填充为'X'
。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。、
💡边界的●改成. 里面被包围的●改成X
class Solution { int m,n;int[] dx={0,0,-1,1};int[] dy={1,-1,0,0}; public void solve(char[][] board) { m=board.length;n=board[0].length; for (int j = 0; j < n; j++) { if (board[0][j] == 'O') dfs(board, 0, j); if (board[m - 1][j] == 'O') dfs(board, m - 1, j); } for (int i = 0; i < m; i++) { if (board[i][0] == 'O') dfs(board, i, 0); if (board[i][n - 1] == 'O') dfs(board, i, n - 1); } for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if (board[i][j] == 'O') board[i][j] = 'X'; if (board[i][j] == '.') board[i][j] = 'O'; } } } void dfs(char[][] board,int i,int j){ board[i][j]='.'; for(int k=0;k<4;k++){ int x=i+dx[k];int y=j+dy[k]; if(x>=0&&x<m&&y>=0&&y<n&&board[x][y]=='O'){ //board[x][y]='.'; dfs(board,x,y); } } } }
太平洋大西洋水流问题
649
相关企业
有一个
m × n
的矩形岛屿,与 太平洋 和 大西洋 相邻。 “太平洋” 处于大陆的左边界和上边界,而 “大西洋” 处于大陆的右边界和下边界。这个岛被分割成一个由若干方形单元格组成的网格。给定一个
m x n
的整数矩阵heights
,heights[r][c]
表示坐标(r, c)
上单元格 高于海平面的高度 。岛上雨水较多,如果相邻单元格的高度 小于或等于 当前单元格的高度,雨水可以直接向北、南、东、西流向相邻单元格。水可以从海洋附近的任何单元格流入海洋。
返回网格坐标
result
的 2D 列表 ,其中result[i] = [ri, ci]
表示雨水从单元格(ri, ci)
流动 既可流向太平洋也可流向大西洋 。示例 1:
输入: heights = [[1,2,2,3,5],[3,2,3,4,4],[2,4,5,3,1],[6,7,1,4,5],[5,1,1,2,4]] 输出: [[0,4],[1,3],[1,4],[2,2],[3,0],[3,1],[4,0]]
正向思维: 从每一个地方去看是否能到达大西洋和太平洋;
逆向思维: 从太平洋和大西洋的 边界出发 ,标记能达到的地方。标记两次true的就是。
import java.util.ArrayList;
import java.util.List;
class Solution {
int m, n;
public List<List<Integer>> pacificAtlantic(int[][] h) {
m = h.length;
n = h[0].length;
boolean[][] pac = new boolean[m][n];
boolean[][] atl = new boolean[m][n];
List<List<Integer>> ret = new ArrayList<>(1000);
for (int i = 0; i < m; i++) dfs(h, i, 0, pac);
for (int j = 0; j < n; j++) dfs(h, 0, j, pac);
for (int i = 0; i < m; i++) dfs(h, i, n - 1, atl);
for (int j = 0; j < n; j++) dfs(h, m - 1, j, atl);
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (pac[i][j] && atl[i][j]) {
List<Integer> coordinates = new ArrayList<>();
coordinates.add(i);
coordinates.add(j);
ret.add(coordinates);
}
}
}
return ret;
}
int[] dx = {0, 1, 0, -1};
int[] dy = {1, 0, -1, 0};
void dfs(int[][] h, int i, int j, boolean[][] vis) {
vis[i][j] = true;
for (int k = 0; k < 4; k++) {
int x = i + dx[k];
int y = j + dy[k];
if (x >= 0 && x < m && y >= 0 && y < n && !vis[x][y] && h[x][y] >= h[i][j]) {
dfs(h, x, y, vis);
}
}
}
}