主题空间
难度:
标签:
题目描述
English description is not available for the problem. Please switch to Chinese.
代码结果
运行时间: 1051 ms, 内存: 25.8 MB
/*
* 思路:我们需要找到不与走廊('0')直接相邻的最大主题空间面积。为了实现这个功能,可以按以下步骤操作:
* 1. 使用深度优先搜索(DFS)遍历所有的主题空间,并记录每个空间的面积。
* 2. 在DFS过程中,如果当前主题空间与走廊相邻,标记该空间为与走廊相邻。
* 3. 遍历所有记录的面积,找出不与走廊相邻的最大面积。
* 使用Java Stream API改进数据处理和操作。
*/
import java.util.*;
import java.util.stream.*;
public class Solution {
private int rows, cols;
private boolean[][] visited;
private char[][] grid;
private int[] dx = {-1, 1, 0, 0};
private int[] dy = {0, 0, -1, 1};
public int maxArea(String[] gridStr) {
this.rows = gridStr.length;
this.cols = gridStr[0].length();
this.visited = new boolean[rows][cols];
this.grid = new char[rows][cols];
for (int i = 0; i < rows; i++) {
this.grid[i] = gridStr[i].toCharArray();
}
List<int[]> areas = new ArrayList<>();
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
if (!visited[i][j] && grid[i][j] != '0') {
areas.add(dfs(i, j));
}
}
}
return areas.stream()
.filter(result -> result[1] == 0) // 过滤不与走廊相邻的空间
.mapToInt(result -> result[0])
.max()
.orElse(0);
}
private int[] dfs(int x, int y) {
visited[x][y] = true;
int area = 1;
boolean isAdjacentToCorridor = false;
for (int i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if (nx >= 0 && nx < rows && ny >= 0 && ny < cols) {
if (grid[nx][ny] == '0') {
isAdjacentToCorridor = true;
} else if (!visited[nx][ny] && grid[nx][ny] == grid[x][y]) {
int[] result = dfs(nx, ny);
area += result[0];
isAdjacentToCorridor = isAdjacentToCorridor || result[1];
}
}
}
return new int[]{area, isAdjacentToCorridor ? 1 : 0};
}
}
解释
方法:
此题解采用了广度优先搜索(BFS)的方法来解决问题。首先,使用一个二维数组info来记录是否访问过每个单元格。初始时,将所有边界单元格以及所有的'0'(走廊)加入到搜索队列opts中,因为它们都与边界接壳。接下来,进行广度优先搜索,将与走廊相连的主题空间的每个部分标记为已访问。这一步确保了所有与走廊相连的区域都被标记。之后,再遍历数组,对于每一个未被访问的非走廊格子,从该位置出发进行广度优先搜索计算该区域的大小,并更新最大面积。最终返回最大的非与走廊相邻的主题空间面积。
时间复杂度:
O(m*n)
空间复杂度:
O(m*n)
代码细节讲解
🦆
在广度优先搜索中,如何确保所有与走廊相连的区域都被正确地标记为已访问?
▷🦆
为什么在初始化队列时,只将边界单元格以及'0'(走廊)单元格加入队列?非边界的'0'单元格是否也应该被加入?
▷🦆
在第一次执行BFS时,为什么可以保证所有与走廊相连的区域都被访问,即使走廊可能由多个不连续的部分组成?
▷