文章目录
- [1. 图像渲染(LC733)](#1. 图像渲染(LC733))
- [2. 岛屿数量(LC200)](#2. 岛屿数量(LC200))
- [3. 岛屿的最大面积(LC695)](#3. 岛屿的最大面积(LC695))
- [4. 被围绕的区域(LC130)](#4. 被围绕的区域(LC130))
1. 图像渲染(LC733)
题目描述

解题思路
从起点向四个方向,类似层序遍历,一层一层开始搜索
代码实现
java
class Solution {
public int[][] floodFill(int[][] image, int sr, int sc, int color) {
int prev = image[sr][sc];
if(prev == color)
return image;
int m = image.length;
int n = image[0].length;
int[] dx = {1,-1,0,0};
int[] dy = {0,0,1,-1};
Queue<int[]> queue = new LinkedList<>();
queue.offer(new int[]{sr,sc});
while(!queue.isEmpty()){
int[] top = queue.poll();
int i = top[0];
int j = top[1];
image[i][j] = color;
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 && image[x][y]==prev)
queue.offer(new int[]{x,y});
}
}
return image;
}
}
2. 岛屿数量(LC200)
题目描述

代码实现
java
class Solution {
public int numIslands(char[][] grid) {
Queue<int[]> queue = new LinkedList<>();
int m = grid.length;
int n = grid[0].length;
boolean[][] check = new boolean[m][n];
int ret = 0;
int[] dx = {1,-1,0,0};
int[] dy = {0,0,1,-1};
for(int i = 0;i<m;i++){
for(int j = 0;j<n;j++){
if(!check[i][j] && grid[i][j] == '1'){
ret++;
check[i][j] = true;
queue.offer(new int[]{i,j});
while(!queue.isEmpty()){
int[] top = queue.poll();
int ii = top[0];
int jj = top[1];
for(int k = 0;k<4;k++){
int x = ii+dx[k];
int y = jj+dy[k];
if(x>=0 && x<m && y>=0 && y<n && !check[x][y] && grid[x][y]=='1'){
queue.offer(new int[]{x,y});
check[x][y] = true;
}
}
}
}
}
}
return ret;
}
}
3. 岛屿的最大面积(LC695)
题目描述

代码实现
java
class Solution {
public int maxAreaOfIsland(int[][] grid) {
int m = grid.length;
int n = grid[0].length;
boolean[][] check = new boolean[m][n];
int[] dx = {0,0,1,-1};
int[] dy = {1,-1,0,0};
int ret = 0;
Queue<int[]> queue = new LinkedList<>();
for(int i = 0;i<m;i++){
for(int j=0;j<n;j++){
if(!check[i][j] && grid[i][j]==1){
check[i][j] = true;
queue.offer(new int[]{i,j});
int area = 1;
while(!queue.isEmpty()){
int[] top = queue.poll();
int ii = top[0];
int jj = top[1];
for(int k = 0;k<4;k++){
int x = ii + dx[k];
int y = jj + dy[k];
if(x>=0 && x<m && y>=0 && y<n && !check[x][y] && grid[x][y] ==1){
queue.offer(new int[]{x,y});
check[x][y] = true;
area++;
}
}
}
ret = Math.max(ret,area);
}
}
}
return ret;
}
}
4. 被围绕的区域(LC130)
题目描述

解题思路

由于边界的O难处理,可以先遍历边界,对边界进行广度优先遍历,修改为'.',接着对数组进行遍历,如果遇到'O'可以直接修改为'x';遇到'.'可以直接修改为'O'
代码实现
java
class Solution {
Queue<int[]> queue = new LinkedList();
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 i = 0;i<m;i++){
if(board[i][0] == 'O')
bfs(board,i,0);
if(board[i][n-1] == 'O')
bfs(board,i,n-1);
}
for(int j = 0;j<n;j++){
if(board[0][j] == 'O')
bfs(board,0,j);
if(board[m-1][j] == 'O')
bfs(board,m-1,j);
}
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 bfs(char[][] board,int i, int j){
queue.offer(new int[]{i,j});
board[i][j] = '.';
while(!queue.isEmpty()){
int[] top = queue.poll();
int ii = top[0];
int jj = top[1];
for(int k = 0;k<4;k++){
int x = ii +dx[k];
int y = jj +dy[k];
if(x>=0 && x<m && y>=0 && y<n && board[x][y]=='O'){
board[x][y]='.';
queue.offer(new int[]{x,y});
}
}
}
}
}